web-dev-qa-db-fra.com

Lier le service à l’activité dans Android

J'essaie d'écrire un simple lecteur multimédia qui lit les flux audio en utilisant RTSP. J'ai une activité graphique et un service qui effectue la lecture. Ma question est de savoir comment mieux communiquer entre l'activité et le service (par exemple, mettre à jour l'interface graphique en fonction de l'état du lecteur).

Je sais que je peux lier le service à l'activité à l'aide de onBind (), mais si je comprends bien, cela arrêtera le service si l'activité est supprimée. Je souhaite continuer la lecture même si l'utilisateur quitte l'activité. Existe-t-il un moyen standard ou préféré de traiter ce problème?

86
aspartame

"Si vous démarrez un Android Service avec startService(..)), ce service restera actif jusqu'à ce que vous appeliez explicitement stopService(..). Il existe deux raisons pour lesquelles un service peut être Si quelqu'un appelle Context.startService(), le système récupère le service (le crée et appelle sa méthode onCreate() si nécessaire), puis appelle sa onStartCommand(Intent, int, int) avec les arguments fournis par le client. À ce stade, le service continue à fonctionner jusqu'à l'appel de Context.stopService() ou stopSelf(). Notez que plusieurs appels à Context.startService() ne le sont pas. imbriquent (bien qu'ils aboutissent à plusieurs appels correspondants à onStartCommand()), donc peu importe le nombre de démarrages, un service sera arrêté une fois Context.stopService() ou stopSelf() est appelé, mais les services peuvent utiliser leur méthode stopSelf(int) pour s’assurer qu’ils ne sont pas arrêtés tant que leurs intentions n'ont pas été traitées.

Les clients peuvent également utiliser Context.bindService() pour obtenir une connexion persistante à un service. De même, cela crée le service s'il n'est pas déjà en cours d'exécution (appelant onCreate() en même temps), mais n'appelle pas onStartCommand(). Le client recevra l'objet IBinder que le service renvoie de sa méthode onBind(Intent), permettant ainsi au client de rappeler le service. Le service restera actif tant que la connexion sera établie (que le client conserve ou non une référence sur le IBinder du service). Habituellement, le IBinder renvoyé correspond à une interface complexe écrite en AIDL.

Un service peut être à la fois démarré et lié à des connexions. Dans un tel cas, le système continuera à faire fonctionner le service aussi longtemps qu'il sera démarré ou s'il aura une ou plusieurs connexions avec l'indicateur Context.BIND_AUTO_CREATE. Si aucune de ces situations ne se vérifie, la méthode onDestroy() du service est appelée et le service est effectivement terminé. Tout le nettoyage (arrêt des threads, désinscription des destinataires) doit être terminé lors du retour de onDestroy(). "

148
Schildmeijer

Tout d'abord, 2 choses que nous devons comprendre

Client

  • il fait la demande à un serveur spécifique

    bindService(new 
        Intent("com.Android.vending.billing.InAppBillingService.BIND"),
            mServiceConn, Context.BIND_AUTO_CREATE);`
    

ici mServiceConn est une instance de ServiceConnection class (intégrée), c’est en fait une interface que nous devons implémenter avec deux méthodes (la première pour le réseau connecté et le second réseau non connecté) pour surveiller l’état de la connexion réseau.

Serveur

  • Il gère la requête du client et crée une réplique de celle-ci, qui est privée uniquement pour le client qui envoie la requête et cette réplique du serveur s'exécute sur un autre thread.

Maintenant, côté client, comment accéder à toute la méthode du serveur?

  • réponse d'envoi du serveur avec IBind Object.so L'objet IBind est notre gestionnaire qui accède à toutes les méthodes de service à l'aide de l'opérateur (.).

    MyService myService;
    public ServiceConnection myConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder binder) {
            Log.d("ServiceConnection","connected");
            myService = binder;
        }
        //binder comes from server to communicate with method's of 
    
        public void onServiceDisconnected(ComponentName className) {
            Log.d("ServiceConnection","disconnected");
            myService = null;
        }
    }
    

maintenant, comment appeler la méthode qui se trouve dans le service

myservice.serviceMethod();

ici myService est un objet et serviceMethode est une méthode en service. Et de cette manière, la communication est établie entre le client et le serveur.

22
Hardik Gajera

J'ai essayé d'appeler

startService(oIntent);
bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);

par conséquent, je pourrais créer un service collant et me lier à celui-ci. Didacticiel détaillé pour exemple de service lié .

10
M.Hefny

Il existe une méthode appelée nbindService qui prend un ServiceConnection que vous aurez créé lors de l'appel de bindService. Cela vous permettra de vous déconnecter du service tout en le laissant en marche.

Cela peut poser un problème lorsque vous vous reconnectez, car vous ne savez probablement pas si elle s'exécute ou non lorsque vous relancez l'activité. Vous devrez donc en tenir compte dans votre code d'activité.

Bonne chance!

5
vrutberg