Bonjour à tous,
Désolé, je n'ai pas réussi à trouver une discussion qui puisse répondre à mon problème. Si besoin, pourrais-je connaître l'endroit approprié pour ce post ?
J'ai écrit une petite application GPS qui collecte en continu les géolocalisations d'un parcours. Aucun problème pour la réaliser. Elle fonctionne à peu près correctement. Je ne m'étendrais donc pas sur cet aspect.
Seulement, voilà... à l'usage, cette application est inexploitable.
J'essaie donc d'expliquer pourquoi ?
Collecter les géolocalisations d'un parcours peut durer un temps suffisamment important (15, 30 minutes, voir une ou plusieurs heures) durant lequel on peut être amené à passer ou recevoir une communication téléphonique, envoyer un SMS, bref, exécuter une autre application. Dans ces cas de figure, l'application GPS est tuée par Android conformément à ce qui est écrit dans la doc et éventuellement relancée s'il y a rotation d'écran. Pendant le laps de temps qui sépare l'arrêt de la reprise, la collecte est interrompue provoquant alors un trou dans la trajectoire. Ceci est donc inacceptable.
Question générale :
Comment une application peut-elle lancer en arrière-plan une autre application qui puisse continuer à travailler imperturbablement en parallèle avec d'autres applications ?
Ce que j'ai essayé sans succès :
Ce type d'application est fort simple à découper. Il se réduit à 2 composants complètement indépendants :
- L'activité principale se contente simplement d'afficher des informations de géolocalisation qu'elle peut puiser dans un conteneur par exemple. Cette application, en relation avec l'utilisateur, peut très bien être interrompue n'importe quand, ce n'est pas gênant, elle peut être relancée à tout moment.
- l'activité-fille collecte les géolocalisations sans interruption tant qu'une commande ne lui demande pas de s'arrêter.
Ceci sous entend 2 problèmes :
- L'application-fille (2) d'arrière plan ne fait que calculer des informations qui doivent être affichées par l'activité (1). Il faut donc une communication ASYNCHRONE avec l'activité (1) qui, fonctionnellement est autonome.
- L'activité (1) prépare les conditions de la géolocalisation, lance l'activité (2) et va chercher à intervalles réguliers les informations déposées de la géolocalisation qu'elle affiche.
Pour lancer l'application (2) du GPS, j'ai utilisé la séquence que l'on trouve maintes fois sur la Toile :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ....
try
{
Intent intention = getPackageManager().getLaunchIntentForPackage("com.example.tachygps");
if (intention == null)
throw new PackageManager.NameNotFoundException() ;
intention.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intention);
}
catch (PackageManager.NameNotFoundException e)
{
System.out.println(" !!! " + "Application non présente sur le téléphone...") ;
}
.... |
Elle marche parfaitement bien. L'activité (2) réagit à l'Emulator Control.
Questions complémentaires :
A - Comment coder l'application (2) pour qu'elle n'affiche pas ce layout blanc malgré la suppression :
- de la carte « setContentView(R.layout.tachy_gps) ; »
- du fichier layout « res/layout/tachy_gps.xml »
ce qui a le fâcheux inconvénient de la tuer pour lancer une autre application.
B - Quel est l'outil le mieux adapté pour assurer la communication ASYNCHRONE entre les deux applications en gérant un conteneur ?
Utiliser un simple fichier me paraît assez limite pour la partageabilité. J'avais pensé aux 'Shared Preferences" en "MODE_MULTI_PROCESS", je n'ai pas réussi à les faire marcher !... .
Auriez-vous une autre méthode pour résoudre le problème ?
En vous remerciant par avance pour vos éclairages.
Lou Papet
Partager