2010-07-02 6 views
1

Dans mon application Android, certaines données doivent être synchronisées quotidiennement mais doivent également être mises à jour toutes les heures lorsqu'un utilisateur se trouve dans l'application.Meilleure stratégie pour implémenter ce comportement dans l'application Android?

J'ai déjà implémenté un service qui est appelé à partir d'une alarme pour la mise à jour quotidienne. J'ai un problème avec le développement d'une stratégie pour faire la synchronisation horaire. Je pourrais aussi utiliser une alarme horaire et tirer la même intention, mais puisque votre application peut être tuée à tout moment, il n'y aurait aucun moyen de l'annuler (et puisqu'ils utilisent la même Intention, annuler annulera TOUTES les alarmes, y compris ma synchronisation quotidienne, donc ce n'est probablement pas bon).

L'autre option consiste à utiliser une minuterie qui est définie à l'intérieur de l'application, et qui a déclencher mon intention à l'intérieur de l'application. Je suppose que tous les Timers sont annulés quand une application est détruite? Mais mon application se compose de plusieurs activités et je veux que le minuteur fonctionne à travers toutes les activités, comment puis-je faire cela? Je ne veux pas dupliquer le code - nous utilisons déjà une sous-classe pour Activity et ListActivity.

Répondre

2

J'ai des données qui doivent être synchronisés tous les jours, mais doit également être mis à jour toutes les heures lorsqu'un utilisateur est l'intérieur de l'application.

La solution semble facile: laisser tomber la deuxième exigence. Peu d'applications sont utilisées continuellement pendant des heures, puisque les gens ont tendance à utiliser leurs téléphones Android pour d'autres choses (par exemple, les téléphones), donc votre code de mise à jour horaire ne sera probablement jamais exécuté.

je pouvais utiliser une alarme horaire trop et feu la même intention, mais depuis votre application peut être tué à tout moment, il n'y aurait aucun moyen de l'annuler

FWIW, votre l'application ne sera pas tuée pendant qu'elle est à l'écran. Et, même si ce n'est pas à l'écran, vous ne voulez pas que les mises à jour soient toutes les heures.

Je suppose que tous les temporisateurs sont annulés lorsqu'une application est correctement exécutée?

Les applications ne sont généralement pas "supprimées". Nous vous attendons à nettoyer après vous quand vos activités sont appelées avec onDestroy(). Si vous configurez le Timer avec un thread démon, vous devrez terminer ce thread.

Mais mon application se compose de plusieurs activités et je veux la minuterie pour travail dans toutes les activités, comment puis-je faire cela?

Liez à votre service à partir de chacune de vos activités. S'il est démarré par votre alarme Intent, faites-le faire un traitement de mise à jour normal. Si elle est démarrée en raison d'une demande de liaison, assurez-vous simplement que son horaire Timer est en cours d'exécution. Quand il est appelé avec onDestroy() (par exemple, après que toutes les activités sont non liées), faites-le arrêter Timer.

+0

En fait, c'est * le * type d'application que les gens peuvent utiliser pendant des heures (je ne peux pas dire ce que c'est exactement sans enfreindre une NDA). Cependant, j'ai décidé de mettre au rebut l'idée de mise à jour horaire via des temporisateurs/alarmes. Le schéma que j'ai décidé de mettre en œuvre: * Mise à jour une fois par jour via une seule alarme (qui reçoit alors de nouvelles données et définit une nouvelle alarme pour le lendemain). * Si l'utilisateur utilise l'application et qu'il a été> 1h depuis la dernière mise à jour, effectuez la mise à jour en arrière-plan. * Pour une activité spécifique, si l'utilisateur a modifié certaines données, j'expédie ces données. * L'utilisateur peut également forcer la mise à jour manuelle à tout moment. – Eno

+0

@Eno: cela ressemble à un bon plan. – CommonsWare

+0

Je souhaite qu'il y avait un exemple plus approfondi de l'utilisation de wakelock dans Android. J'ai regardé le livre du Busy Coder mais j'ai du mal à le comprendre clairement. – Eno

0

Vous pouvez être en mesure d'exécuter un Timer dans un service d'arrière-plan (qui est moins tué que les activités), mais rien ne garantit qu'Android ne supprimera pas votre service non plus. Et en cours d'exécution quelque chose comme ceci est l'arrière-plan pourrait utiliser beaucoup de batterie.

Qu'en est-il de faire la synchronisation horaire dans un thread d'arrière-plan créé dans onResume? Et juste sauvegarder la dernière fois que l'utilisateur a fait la synchronisation, et si cela a été> une heure juste faire la synchronisation. Parce que je ne pense pas qu'il y ait une raison de synchroniser avec impatience les données que l'utilisateur ne verra jamais.

Questions connexes