2010-01-05 3 views
4

J'ai une application qui utilise un service pour récupérer des données en arrière-plan à la fois pendant que l'application est en cours d'exécution et quand ce n'est pas le cas. Lorsqu'il ne fonctionne pas, je souhaite afficher une notification lorsqu'il y a de nouvelles données, mais pas lorsque l'application est en cours d'exécution.Comment puis-je déterminer quand mon application est en cours d'exécution?

Comment puis-je déterminer dans mon service si l'application est en cours d'exécution ou non?

Répondre

1

Je pense que vous voulez vérifier si une certaine activité est affichée. Si cela est vrai, j'utiliserai la méthode Activity.onCreate() pour définir un indicateur dans l'instance d'application, c'est-à-dire étendre la classe Application avec un champ "uiRunning" et vérifier ce champ dans votre service. onDestroy() devrait être utilisé pour décocher l'attribut. Ne pas oublier d'utiliser votre classe d'application également dans le Manifest.xml

+0

Il n'est pas nécessaire d'utiliser une sous-classe Application - ajoutez simplement une variable statique dans le service, que ces méthodes définissent (ou appelez une fonction statique qui maintient l'état statique interne). De même que pour l'objet Application, il n'y a aucune garantie que Activity.onDestroy() sera détruit - si le système a besoin de la mémoire du processus, il supprimera simplement le processus et aucun code ne sera exécuté. – hackbod

+0

Ma seule idée est dans ce sens aussi. J'espérais qu'il y avait une méthode uiRunning quelque part. Je pourrais avoir des applications où différentes activités s'exécutent à des moments différents, ce qui rendrait la synchronisation du drapeau plus complexe. Je suppose que je devrais définir/enlever le drapeau dans onStart/onStop? – Wilken

0

Je suis d'accord avec l'utilisation d'une seule application d'activité de onCreate()/OnDestroy(), si une application avec de multiples activités serait mieux d'utiliser Application.onCreate()/onTerminate() afin d'éviter de déclencher l'état uiRunning lors du changement d'activités.

+0

Application.onTerminate() ne sera jamais tué dans le fonctionnement normal du système - lorsque la mémoire est nécessaire à partir d'un processus d'arrière-plan, elle est simplement supprimée. – hackbod

+0

par tué, vous voulez dire appelé? – Wilken

+0

non son juste tué, c'est juste pour la simulation .. L'application n'a pas un appel pour notifier qu'il sera tué. –

0

Ceci est vraiment facile. Vous utilisez un Mutex nommé.

Mettre ceci dans l'application que vous voulez vérifier:

bool createdNew; 
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew); 
if (createdNew) 
{ 
    var app = new YourProcess(); 
    app.run(); 
    mutex.Close(); 
} 

Mettre cela dans l'application qui vérifie que l'autre application est en cours d'exécution:

bool createdNew; 
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew); 
if (createdNew) 
{ 
    Console.WriteLine("App not running"); 
    mutex.Close(); 
} else { 
    Console.WriteLine("App is running"); 
} 
+0

C'est un code .net, n'est-ce pas? En dehors de cela, je suis d'accord, un mutex ferait la même chose. – Wilken

0

Une autre option consiste à mettre en œuvre une modèle d'écouteur et demandez à votre service de gérer une liste d'écouteurs avec des méthodes sur votre interface de service pour addListener() et removeListener(). Votre activité peut être ajoutée en tant qu'écouteur une fois qu'elle s'est connectée au service et qu'elle s'est retirée onStop() (c'est-à-dire lorsque l'application n'est plus visible pour l'utilisateur ou a complètement fermé).

Dans votre service, vérifiez le nombre d'écouteurs. S'il n'y a pas d'auditeurs, vous savez que vous devez créer votre notification.

0

Une autre façon d'accomplir est de découpler votre récepteur de données à un «service» qui fonctionnera toujours en arrière-plan. Vous pouvez lier votre application au service et afficher les données récupérées par le service. Le problème avec l'application en arrière-plan est qu'Android va tuer l'application une fois qu'elle sera trop vieille. Il est toujours préférable d'avoir un tel contexte d'exécution d'application que de service plutôt que d'activité.

0

Ce que j'ai fait a été d'utiliser un drapeau dans mon service, que l'activité racine définit et efface sur onStart/onStop. Cela fonctionne plutôt bien.

0

Voilà comment je l'ai fait et fonctionne parfaitement avec seulement quelques lignes de code:

Dans étendu classe App:

public static boolean isAppInFront = false; 

En vous Activité principale:

@Override 
public void onStart() { 
    super.onStart(); 
    MyApplication.isAppInFront = true; 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (isFinishing()) 
     MyApplication.isAppInFront = false; 
} 
Questions connexes