2010-10-01 4 views
21

Je semble avoir une tâche classique, mais je ne trouve aucun exemple sur la façon de le faire.comment un service renvoie-t-il le résultat d'une activité?

Je veux télécharger quelque chose. Eh bien, j'appelle un service web et j'obtiens une réponse ... mais c'est à peu près la même chose. Pour ce faire, j'ai une activité qui démarre un service qui engendre un thread qui fait le travail.

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

(je suppose que le démarrage d'une autre activité pour gérer le travail d'afficher le résultat serait simple)

Mon problème est de savoir comment le service notifie une activité (celui qui a commencé ou un autre) de quelque chose?

Tous les pointeurs vers des exemples sont très appréciés.

Cordialement

+0

Vous pouvez utiliser le récepteur de diffusion locale pour ce contrôle ce simple exemple de diffusion locale ici http://wiki.workassis.com/android-local-broadcast-receiver/ –

Répondre

36

Selon la documentation Google, si votre activité et le service sont au sein de la même application, en utilisant un LocalBroadcastManager est préférable à sendBroadcast (intention) parce que les informations envoyées ne passe pas par le système qui élimine le risque d'interception. http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

C'est assez facile à utiliser.

Dans votre activité, créez un BroadcastReceiver et ajouter dynamiquement 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 l'utiliser pour envoyer une intention. Je le mets habituellement dans sa propre méthode comme ceci:

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); 
} 
+0

Ceci est beaucoup plus utile que la réponse acceptée en termes de code de travail –

+0

Cela devrait être la réponse acceptée. –

4

Si vous avez besoin de retour différents types de données, telles que la classe définie par l'utilisateur, vous pouvez essayer bindService et rappel. Cela peut éviter l'interface parcelable d'implémentation que sendBroadcast.

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

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

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

Android: restful API service

Hope it helps.

+0

Excellent exemple pour le concept 'bindService()', implémentant correctement le concept. – Eido95

Questions connexes