Jump to content

Détecter si mon application est active


Pierre87

Recommended Posts

Comment détecter quand mon appplication n'es plus active/visible ?

Je ne parle pas de l'état individuel de chaque Activity, mais bien de l'application en général.

J'ai cherché, mais je n'ai rien vu à ce niveau là :/

Je ne pense pas que ce soit facile mais explique nous exactement ce que tu cherches à faire. Si tu veux t'assurer que ton application ne soit lancée que si elle ne l'est pas, il faut utiliser un flag dans ton startActivity() (plus le nom en tête cependant).

Link to comment
Share on other sites

Ok, c'est pour mon application PRemoteDroid (controle de PC à distance, voir ma signature)

Voilà à quoi ressemblait son architecture avant :

- Une Activity (ControlActivity), qui se lance automatiquement au démarrage

- D'autres Activity (l'aide ou les paramètres par exemple) qui se lancent depuis ControlActivity.

- ControlActivity possède un objet qui gère la connexion (de type TCP) avec le serveur

- L'état de la connexion est géré par l'état de ControlActivity (onResume, on ouvre une connexion, onPause on la ferme).

- Les autres Activity ne font pas du tout appel à la connexion

Ca marchait plutôt bien jusque là, j'étais sûr d'avoir une connexion "à jour" à chaque fois que j'affiche ControlActivity.

Problèmes :

- On bascule l'écran en mode paysage, on reset la connexion

- Quand on passe d'une Activity à une autre, ça reset aussi la connexion (alors que ce n'est pas toujours nécessaire)

- Si je veux rajouter d'autres Activity qui font appel à la connexion, ça ne marche pas :/

La solution que j'ai trouvé :

- J'exploite la classe Application, en paramétrant mon fichier manisfest.

- Mon objet Application s'occupe maintenant de la connexion réseau (aussi bien de l'émission que de la réception)

- Une bonne partie de mes Activity et View connaissent mon objet Application, pour ENVOYER des données (clic ou déplacement de souris pour le moment)

Mais ça me pose d'autres problèmes :

- Je ne sais pas à quel moment dire "je démarre/coupe/reset ma connexion"

- Quand mon application reçoit un message particulier, elle a besoin de le transmettre à une View de ControlActivity, et là c'est le drame...

J'ai vraiment l'impression que :

- Il est facile pour une Activity ou une View d'accéder à Application

- Il est très difficile de faire communiquer Application avec le reste de mon programme

- Je suis dans le caca

J'espère avoir été assez clair :/

Link to comment
Share on other sites

design pattern oberver ^^ + codage de porc.

en gros tu fais une interface genre

public interface Bidule{

void faitUnTruc();

}

ton activity tu lui rajoute implements Bidule.

Sur l'application tu rajoute une grosse liste statique

private static List mMaListePourrie = new ArrayList();

et une méthode statique:

public static void registerBidule(Bidule bide){

mMaListePourrie.add(bide);

}

et ta controlview truc à sa création tu lui fait faire:

Application.registerBidule(this);

du coup quand ton applicatin eçoit son évènement elle a juste à faire:

foreach(Bidule bibi : mMaListePourrie){

bibi.faitUnTruc();

}

avec des paramètres s'il le faut : chaque activity enregistrée sera au courant de l'évènement.

pour la connection idem : un gros boolean static que tu modifie depuis tes Activity si necessaire.

Link to comment
Share on other sites

Argh...

J'allais répondre la meme chose, mais on m'a appelé pour le boulot (c 'est penible ces gens qui veulent que je bosse quand je suis au travail )...

Sinon, je ne suis pas sur de voir l'interet d'avoir une liste à gérer : tu ne veux envoyer ton message réseau qu'à l'activité à l'écran, non ?

Dans ce cas là, tu la register sur le OnCreate / On resume (?), et tu la déregister sur le onpause, comme tu faisais avant...

Mais sur le principe c'est bien ca : à l'entrée de ton activity, tu signales à l'application 'Yep, moi je veux des messages', et l'application peut ensuite lui envoyer quand il faut...

Emmanuel / Alocaly

Link to comment
Share on other sites

C'est vrai que vu comme ça ...

Ca me parait aussi logique !

Tout dépend de si je veux que plusieurs Activity puissent recevoir les messages en même temps ...

Mais bon, je bloque toujours sur la manière de gérer ma connexion TCP !

C'est très difficile d'exprimer les conditions qui déterminent si je dois établir ou couper la connexion :/

(et la réinitialiser aussi)

Le plus simplement, ça serait :

- Quand une Activity de mon application est visible, j'établis la connexion

- Quand aucune Activity de mon application n'est visible, je coupe la connexion

Si je me sers du fait qu'une Activity est "register" pour recevoir des messages, ça peut marcher :

Le onStart de l'Activity suivante est exécuté avant le onStop de l'Activity quittée

Mais il faut donc que je garde une liste d'Activity "register"

Link to comment
Share on other sites

  • 2 weeks later...

J'ai implémenté ça dans mon appli, et c'est pas mal :

http://code.google.com/p/premotedroid/source/browse/trunk/PRemoteDroid%20Client/src/org/pierre/remotedroid/client/app/PRemoteDroid.java

Voilà comment ça fonctionne :

- Quand une Activity s'ouvre, elle s'enregistre auprès de mon Application

- Quand une Activity se ferme, elle se supprime de mon Application

Et pour établir la connexion

- Si on enregistre une Activity, et qu'il n'y a pas de connexion : on établi une connexion

- Si on supprime une Activity, et qu'il n'y en a plus d'autre, on PLANIFIE la fermeture de la connexion

Quand on planifie cette fermeture, on attend un certain temps, et si à la fin il n'y a pas d'Activity enregistrée, on ferme la connexion

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...