Service nicht erstellt wird (oder die Verbindung) nach bindService()
Habe ich diese einfache service -, daß die Sendungen der aktuellen Position des Benutzers. Ich will die Bindung Mechanismus nur zur Kontrolle der service-life-cycle, aber der service ist einfach nicht starten.
Was habe ich falsch gemacht?
public class GPSActivity extends ListActivity {
...
protected void onResume() {
super.onResume();
Log.i("Service", "Service bound");
Intent intent = new Intent(this, LocationService.class);
bindService(intent, service_connection , Context.BIND_AUTO_CREATE);
}
protected void onPause() {
if (dataUpdateReceiver!=null)
unregisterReceiver(dataUpdateReceiver);
unbindService(service_connection);
super.onPause();
}
class LocationServiceConnection implements ServiceConnection{
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Service", "Service Connected");
}
public void onServiceDisconnected(ComponentName name) {
}
}
}
LocalBinder.java
public class LocalBinder<S> extends Binder {
private String TAG = "LocalBinder";
private WeakReference<S> mService;
public LocalBinder(S service){
mService = new WeakReference<S>(service);
}
public S getService() {
return mService.get();
}
}
LocationService.java
public class LocationService extends Service {
public void onCreate() {
initLocationListener();
Log.i("Location Service","onCreate()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("Location Service", "Received start id " + startId + ": " + intent);
return START_NOT_STICKY;
}
private final IBinder mBinder = new LocalBinder<LocationService>(this);
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
...
<service android:name=".LocationService">
</service>
</application>
EDIT: Behoben Dank NickT Antwort.
Den manifest-Eintrag nicht über einen intent-filter oder den richtigen Namen
<service
android:enabled="true"
android:name="com.android.gps.services.LocationService">
<intent-filter>
<action android:name="com.android.gps.services.LocationService" />
</intent-filter>
</service>
Und die Absicht, die ich für die Bindung verwendet wurde, wie Sie Sie verwenden müssen, um beim Start einer Aktivität. der richtige ist:
Intent intent = new Intent("com.android.gps.services.LocationService");
- Was macht Ihr
public IBinder onBind(Intent intent)
Methode inLocationService.java
Aussehen? - Ich Schnitt die Frage an, gehören der onBind () - Methode.
- Hm. Und Sie sind auch nicht immer die
Log.i("Location Service","onCreate()");
melden Sie sich in Ihrem logcat? - Ich bin es nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die onStartCommand wird nur ausgeführt, wenn der Dienst explizit gestartet, es sieht aus wie Sie gerade wollen, um zu binden, was in Ordnung ist. Ich sehe nicht, dass Sie die service-Verbindung korrekt obwohl. Ich werde Entsendung meine stub-Programm, das zeigt, wie eine Bindung an einen service und rufen Sie eine Methode im service, die durch ein Bindemittel. Man mag, um zu sehen, die Abfolge der verschiedenen log-Meldungen. Sie werden natürlich brauchen, um Ihre BroadcastReceiver und onLocationChaged code, um es für Sie sinnvoll ist.
Die Aktivität
Den Service
Manifest
Hoffe, das hilft
Hatte ich meine
Activity
implementierenServiceConnection
gebunden und so:Dann behandelt, die Rückrufe für
onServiceConnected()
undonServiceDisconnected()
in meinemActivity
Beim Aufruf
bindService
Sie können diese Fehlermeldung erhalten:ActivityManager java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token
Überprüfen Sie die Ausgabe von logcat.
Dies ist ein bug von Android.
Um es zu lösen, verwenden Sie
getApplicationContext().bindService(...)