Le Service n'est pas créé (ou connexion) après bindService()
J'ai ce service simple qui diffuse l'emplacement actuel de l'utilisateur. Je veux utiliser le mécanisme de liaison de contrôler le service de cycle de vie, mais le service est tout simplement pas partir.
Qu'ai-je fait de mal?
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: Fixe grâce à NickT de réponse.
Le manifeste d'entrée n'ont pas de filtre d'intention ou le nom correct
<service
android:enabled="true"
android:name="com.android.gps.services.LocationService">
<intent-filter>
<action android:name="com.android.gps.services.LocationService" />
</intent-filter>
</service>
Et de l'intention que j'ai utilisé pour la liaison a été comme ceux que vous devez utiliser lors du démarrage d'une activité. la bonne est:
Intent intent = new Intent("com.android.gps.services.LocationService");
Quel est votre
J'ai édité la question d'inclure le onBind() la méthode.
Hm. Et vous n'êtes même pas obtenir le
Je ne suis pas.
public IBinder onBind(Intent intent)
méthode dans LocationService.java
ressembler?J'ai édité la question d'inclure le onBind() la méthode.
Hm. Et vous n'êtes même pas obtenir le
Log.i("Location Service","onCreate()");
connectez-vous à votre logcat?Je ne suis pas.
OriginalL'auteur bughi | 2012-05-14
Vous devez vous connecter pour publier un commentaire.
La onStartCommand ne s'exécutera que si le service est de démarrer explicitement, il semble que vous êtes juste envie de se lier à elle, ce qui est bien. Je ne vois pas ce que vous avez mis en place le service de connexion correctement. Je poste mon stub programme qui montre comment lier à un service et appeler une méthode dans le service par l'intermédiaire d'un liant. Vous pouvez exécuter cette et voir la séquence des différents messages du journal. Vous aurez évidemment besoin d'ajouter votre BroadcastReceiver et onLocationChaged code de la rendre utile pour vous.
L'Activité
Le Service
Le Manifeste
Espère que cette aide
OriginalL'auteur NickT
J'ai eu mon
Activity
mettre en œuvreServiceConnection
et lié comme ceci:Ensuite géré les rappels pour
onServiceConnected()
etonServiceDisconnected()
dans monActivity
Qui permettra de créer le service, c'est à dire appeler le onCreate() la méthode et il va se lier à votre activité, mais il n'ira PAS en appel de la onStartCommand() pour le service. Par conséquent, il ne sera pas démarrer le service.
OriginalL'auteur ScouseChris
Lorsque vous appelez
bindService
vous pouvez obtenir cette erreur:ActivityManager java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.android.server.am.ActivityRecord$Token
Vérifiez la sortie de la logcat.
C'est un bug d'Android.
Pour résoudre ce problème, utilisez
getApplicationContext().bindService(...)
OriginalL'auteur HChen