web-dev-qa-db-fra.com

Comment un service de retour entraîne-t-il une activité

Je semble avoir une tâche classique, mais je ne trouve pas d'exemples sur la façon de le faire.

Je veux télécharger quelque chose. Eh bien, j'appelle un service Web et obtenez une réponse ... mais c'est à peu près la même chose.

Pour ce faire, j'ai une activité qui commence un service qui reproche un fil qui fait le travail.

Maintenant, j'aimerais utiliser les données que j'ai eues dans l'activité qui a commencé le service.

(Je suppose que commencer une autre activité pour gérer le travail d'affichage du résultat serait simple)

Mon problème est de savoir comment le service notifie-t-il une activité (celle qui l'a commencé ou une autre) de quelque chose?

Tous les pointeurs d'exemples sont très appréciés.

Salutations

28
Alex Poke

Envoyez une intention de diffusion avec les données via SendBroadcast (), que l'activité reprend avec un BroadCastreCeiver.

Voici un exemple de ce: https://github.com/commonsguy/cw-android/tree/master/service/weatherapI doc: http://developer.android.com/ Référence/Android/Contenu/Broadcastreceiver.html

8
fpanizza

Selon Google Documentation, si votre Activity et Service sont dans la même application, à l'aide d'un localBroadcastmanager est préférable sur SendBroadcast (intention) car les informations envoyées ne vont pas à travers le système qui élimine le risque d'interception.

C'est assez facile à utiliser.

Dans votre activité, créez un BroadcastReceiver et ajoutez de manière dynamique un auditeur dans la méthode OnResume ():

private BroadcastReceiver  bReceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        //put here whaterver you want your activity to do with the intent received
    }           
};

protected void onResume(){
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message"));
}

protected void onPause (){
    super.onPause();
 LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver);
}

Et dans votre service, vous obtenez une instance de localBroadcastmanager et utilisez-la pour envoyer une intention. Je le mets habituellement dans sa propre méthode comme celle-ci:

private void sendBroadcast (boolean success){
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver
    intent.putExtra("success", success);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
54
JDenais

Si vous avez besoin de retourner divers types de données, telles que la classe définie par l'utilisateur, vous pouvez essayer bindService et rappel. Cela peut éviter de mettre en œuvre une interface de colisable que sendBroadcast.

S'il vous plaît voir l'exemple dans mon message:

https://stackoverflow.com/a/22549709/2782538

Et plus, si vous utilisez IntentService, vous pouvez regarder ResultReceiver. Les détails et l'échantillon ont pu être trouvés dans ce post:

Android: service API reposant

J'espère que ça aide.

4
Euporie

Vous pouvez utiliser en attente d'intention , bus d'événement , Messenger ou Boîtiers de diffusion Pour obtenir des données de service à l'activité/fragment, puis effectuez une certaine opération sur les données.

mon article de blog couvre toutes ces approches.

1
Android Developer