Android: comment débloquer sans relâche un service

J'ai un service qui est lié au contexte de l'application comme ceci:

getApplicationContext().bindService( new Intent(this, ServiceUI.class), serviceConnection, Context.BIND_AUTO_CREATE ); protected void onDestroy() { super.onDestroy(); getApplicationContext().unbindService(serviceConnection); } 

Pour une raison quelconque, seulement parfois, le contexte de l'application ne se lient pas correctement (je ne peux pas réparer cette partie), mais dans onDestroy () je fais unbindservice qui lance une erreur

  • Spécification d'un filtre d'intention SEND (partage) pour un service
  • Annonces Youtube avant la vidéo ciblée
  • Android: faire pivoter une image haute résolution génère une erreur de mémoire insuffisante
  • Pourquoi Wrap_Content Fire BindView plus d'une fois
  • Erreur: Impossible de trouver le composant Bower "ionic-platform-web-client"
  • Comment obtenir un lien iframe Webview pour lancer le navigateur?
  •  java.lang.IllegalArgumentException: Service not registered: tools.cdevice.Devices$mainServiceConnection. 

    Ma question est la suivante: Existe-t-il un moyen d'appeler un unbindservice sans unbindservice sécurité en toute sécurité ou vérifier s'il est déjà lié à un service avant de le débrancher?

    Merci d'avance.

    6 Solutions collect form web for “Android: comment débloquer sans relâche un service”

    Essaye ça:

     boolean isBound = false; ... isBound = getApplicationContext().bindService( new Intent(getApplicationContext(), ServiceUI.class), serviceConnection, Context.BIND_AUTO_CREATE ); ... if (isBound) getApplicationContext().unbindService(serviceConnection); 

    Remarque:

    Vous devez utiliser le même context pour lier un service et débrancher un service. Si vous getApplicationContext() service avec getApplicationContext() , vous devriez également utiliser getApplicationContext.unbindService(..)

    Ici, vous pouvez trouver une bonne explication et des codes sources pour travailler avec des services liés. Dans votre cas, vous devez remplacer les méthodes ( onServiceConnected et onServiceDisconnected ) de l'objet ServiceConnection . Ensuite, vous pouvez simplement vérifier la variable mBound dans votre code.

    Faire exactement ce qu'a proposé Andrey Novikov n'a pas fonctionné pour moi. J'ai simplement remplacé:

     getApplicationContext().unbindService(serviceConnection); 

    Avec:

     unbindService(serviceConnection); 

    J'ai trouvé qu'il y a deux problèmes. Tentative de lier plus d'une fois et tentant de dévider plus d'une fois.

    Solution:

     public class ServiceConnectionManager implements ServiceConnection { private final Context context; private final Class<? extends Service> service; private boolean attemptingToBind = false; private boolean bound = false; public ServiceConnectionManager(Context context, Class<? extends Service> service) { this.context = context; this.service = service; } public void bindToService() { if (!attemptingToBind) { attemptingToBind = true; context.bindService(new Intent(context, service), this, Context.BIND_AUTO_CREATE); } } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { attemptingToBind = false; bound = true; } @Override public void onServiceDisconnected(ComponentName componentName) { bound = false; } public void unbindFromService() { attemptingToBind = false; if (bound) { context.unbindService(this); bound = false; } } } 

    Pas sûr de toutes les réponses ci-dessus, cela semblait trop compliqué alors qu'aucun d'entre eux ne correspondait au problème que j'avais.

    Se limitait uniquement à l'une et à l'autre, et le service était définitivement lié au moment de l'appel de unbind (). Je ne veux rien fuir, alors je me suis assuré que j'avais utilisé le même contexte pour les appels bind () et unbind () et qui l'a résolu définitivement! Faire quelque chose comme ceci:

     any_context.getApplicationContext().bind(...); ... another_context.getApplicationContext().unbind(...); 

    Je pense que ce guide n'est pas complètement correct comme mentionné ici Surya Wijaya Madjid. Des fuites de mémoire peuvent survenir lorsque le service relié est désurché et n'est pas encore relié.

    Je pense que cette approche est nécessaire:

     Service mService; private final ServiceConnection mServiceConnection = new ServiceConnection() { boolean bound = false; @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = ((MyService.ServiceBinder) service).getService(); if (!bound) { // do some action - service is bound for the first time bound = true; } } }; @Override public void onDestroy() { if (mService != null) { // do some finalization with mService } if (mServiceConnection.bound) { mServiceConnection.bound = false; unbindService(mServiceConnection); } super.onDestroy(); } public void someMethod() { if (mService != null) { // to test whether Service is available, I have to test mService, not mServiceConnection.bound } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.