2009-08-24 18 views
17

J'ai un service qui télécharge un fichier. Lorsque le téléchargement est terminé, je voudrais mettre à jour ma liste "Fichiers téléchargés" dans mon Activity, mais seulement si le Activity est en cours d'exécution. Je ne veux pas que le Activity démarre s'il n'est pas déjà en cours d'exécution.Comment utiliser une intention pour mettre à jour une activité?

J'espérais que je pourrais le faire en faisant un nouveau Intent avec un drapeau spécial.

Quelqu'un at-il une idée de comment je peux y parvenir? Un petit exemple de code peut-être?

Répondre

19

Vous pouvez créer nouvelle instance de BroadcastReceiver et faire quelque chose le long de ces lignes sur votre méthode onResume() de l'activité:

registerReceiver(myReceiver, new IntentFilter(DownloadService.ACTION_FILE_DOWNLOADED)); 

Après cela, remplacer la méthode OnReceive() de myReceiver pour appeler une fonction qui met à jour le composant que vous voulez : méthode

@Override 
public void onReceive(Context context, Intent intent) { 
... 
    updateViewWithData(service.getNewFileData()); 
... 
} 

Sur OnPause() de votre activité, juste désenregistrer le récepteur:

unregisterReceiver(myReceiver); 

J'espère que cela vous aidera, n'hésitez pas à demander s'il y a quelque chose de flou.

+0

Ceci est très bon moyen de communication. Mais que faire dans le cas où les résultats étaient délivrés, lorsque l'activité était en état de pause? Ainsi, après l'activité onResume, vous pouvez attendre longtemps avant d'obtenir des résultats. Et aucune donnée ne sera reçue, car les données ont été manquées. –

3

La meilleure façon de procéder consiste à lier l'activité "Fichiers téléchargés" au service. Lorsque vous liez le service, dans la fonction onServiceConnected, enregistrez un rappel Binder. Ensuite, chaque fois que de nouvelles données sont disponibles, le service appelle simplement ce rappel. Si l'activité n'est pas en cours d'exécution, la liste de rappel du côté service sera vide, de sorte qu'elle n'informera pas votre activité.

Pour un exemple de cette approche, jetez un oeil à RemoteService.java dans Android SDK:

samples \ ApiDemos \ src \ com \ exemple \ android \ api \ app \

+0

Quel serait l'avantage de cela, par rapport à la messagerie d'intention comme Dimitar Dimitrov proposé? Merci – urSus