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
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
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);
}
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:
J'espère que ça aide.
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.