9
votes

Comment un service distant peut-il envoyer des messages à une activité liée?

J'ai lu le Documentation sur les services liés , où il est montré que vous pouvez facilement communiquer via des messages à partir d'une activité à une télécommande (c'est-à-dire non dans le même contexte), mais existe-t-il un moyen d'envoyer des messages du service à l'activité lié ? Par exemple, mon activité se limite à un service d'arrière-plan de la même application, envoie un message à ce message et à la réception de ce message, le service répond avec un message à l'activité. Comment puis-je implémenter cela? Pouvez-vous me signaler à une documentation qui explique ce sujet?


0 commentaires

4 Réponses :



30
votes

Remarque: Ceci est uniquement destiné aux services et aux activités en cours, et non à distance comme la question posée.

L'utilisation d'un service pour communiquer avec une activité implique de faire un auditeur que vous pouvez passer au service à partir de l'activité. P>

Vous devez créer un service lié à une activité. P>

La première étape consiste à faire un service. Dans le service, assurez-vous d'avoir un objet de liant et la méthode pour renvoyer un objet de liant. Vous trouverez ci-dessous un exemple que j'ai utilisé dans mon service pour récupérer mon classeur. Remarquez également que ce liant a une méthode permettant de définir un auditeur, qui sera enregistré dans le service de type SERVICELISTENER. P>

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}


4 commentaires

Grand exemple, merci d'avoir passé tellement de temps à expliquer le concept.


@Danuofr cela fonctionne en cours. Existe-t-il un moyen d'envoyer un auditeur arbitraire dans les limites de processus?


Seul problème avec cette réponse est: ce n'est que pour un service local. Mais la question est clairement posée sur la façon de faire cela avec un service distant. Mais merci de toute façon d'écrire cela. Mais peut-être noter que ce n'est pas la réponse à la vraie question :)


@Danuofr peut-on donner une idée sur la façon de télécharger des fichiers comme ça?



0
votes

1) Mise en œuvre des méthodes de transaction / ontransact dans son propre bander.Class and Binder Proxy Mise en œuvre d'objets IINTITFACE.CLASS.Class Objets (anon ou en prolongeant une classe directe) en utilisant le passage de ces méthodes Parcel.Class objet
2) Attachez une interface locale à votre propre objet de liant 3) Créer un service et renvoyer une mise en œuvre du proxy de liant à partir de la méthode OnBind 4) Créer un lien avec BINDService (ServiceConnection) 5) Cela permettra de renvoyer le liant proxy de retour via la mise en oeuvre de l'interfecte créée

Ceci est une implémentation Android de IPC avec l'utilisation de l'espace de carnets de noyau P>

simplifiant dans l'exemple de code: P>

class ServiceIPC extends Service {

    @Override
    public Binder onBind()  {
        return new IInterface() {

            IInterface _local = this;         

            @Override 
            public IBinder asBinder() {
               return new Binder() 

                           {   
                               //
                               // allow distinguish local/remote impl 
                               // avoid overhead by ipc call 
                               // see Binder.queryLocalInterface("descriptor");
                               //
                               attachLocalInterface(_local,"descriptor");
                           }

                           @Override
                           public boolean onTransact(int code,
                                                     Parcel in,
                                                     Parcel out,
                                                     int flags) 
                                   throws RemoteException {
                               //
                               //  your talk between client & service goes here 
                               //
                               return whatsoever // se super.onTransact(); 
                           }
                      }
            }    

        }.asBinder();
    }

}


0 commentaires

0
votes

devrait être capable de le faire en utilisant. a Fichier AIDL comme l'API de facturation Android. C'est un moyen de faire des appels RPC (communiquer sur des processus distants). Mais vous devez déclarer chaque méthode que vous souhaitez utiliser. une sorte de comme l'interface ci-dessus déjà mentionnée.


0 commentaires