2010-01-25 11 views
0

J'ai quelques questions concernant la communication entre une activité et un service. Je voudrais écrire une application speedmeter, où l'interface utilisateur est constamment mise à jour avec de nouvelles données provenant du capteur GPS.Android: Communication Activité/Service

Jusqu'à présent, j'ai un LocationListener en cours d'exécution dans un service. Quelle est la meilleure pratique dans Android:

1) Accédez au service depuis une activité, disons toutes les secondes et mettez à jour l'interface utilisateur. Ou,
2) Laissez le service mettre à jour l'interface utilisateur.

Pourriez-vous fournir des liens utiles pour le cas 2), s'il vous plaît?

Cas 1) ne devrait pas poser de problème avec un LocalService et une interface IBinder, n'est-ce pas?

Merci!

+3

Pourriez-vous expliquer pourquoi vous embêtez ici avec un service? Vous n'avez pas besoin d'un seul pour utiliser 'LocationListener'. – CommonsWare

+0

Mon application sera capable d'enregistrer des pistes en arrière-plan, j'ai donc besoin d'un service. –

Répondre

2

Vous avez un service qui reçoit des mises à jour de localisation et vous voulez connaître la meilleure façon de garder l'affichage d'activité mis à jour en temps réel.

En fait, un service n'est pas nécessaire pour "enregistrer des pistes en arrière-plan". Au lieu de cela, utilisez un BroadcastReceiver et utilisez la version de requestLocationUpdates(..) qui prend un PendingIntent. Le PendingIntent que vous passez en requestLocationUpdates(..) doit pointer vers le BroadcastReceiver où vous pouvez faire l'enregistrement de l'emplacement le plus récent des pistes. Ok, alors maintenant vous avez un BroadcastReceiver qui met à jour votre base de données avec des données de piste. Si vous utilisez un ContentProvider (plutôt qu'une base de données directement), vous pouvez faire en sorte que votre activité surveille la base de données à la recherche de modifications. Vous pouvez le faire en appelant la méthode registerContentObserver(..) ContentResolver dans onResume().

getContentResolver().registerContentObserver(uri, false, yourContentObserver); 

Assurez-vous que vous appelez unregisterContentObserver(yourContentObserver) dans votre méthode onPause().

+0

Merci beaucoup. J'ai joué avec des classes statiques et l'interface d'Observer, mais votre solution semble plutôt bien. –

Questions connexes