2012-02-01 2 views
1

J'ai une application qui utilise AsyncTasks pour effectuer des appels REST à un serveur. Chaque fois que la tâche asynchrone est terminée, soit: affiche une boîte de dialogue d'erreur/appelle l'activité suivante (si l'application est au premier plan) ou ne fait rien (l'application est en arrière-plan).Quel est le meilleur moyen de vérifier si une application Android est en premier plan?

Je fais ceci pour éviter qu'une activité n'apparaisse après l'envoi de l'application en arrière-plan.

J'ai vu quelques implémentations:

  1. check android application is in foreground or not?
  2. Determining the current foreground application from a background task or service

Je suis actuellement en utilisant une autre, encore plus simple:

  • onResume de chaque activité que je mets une variable globale comme FOREGROUND
  • onPause de chaque activité, j'ai défini une variable globale comme FOND

Que recommanderiez-vous?

PS Je suis conscient de la meilleure pratique des appels REST comme décrit dans cette vidéo https://www.youtube.com/watch?v=xHXn3Kg2IQE&list=PL73AA672847DC7B35 et dans mon cas spécifique cette approche semble plus appropriée.

Répondre

4
private boolean isAppForground() { 

     ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningAppProcessInfo> l = mActivityManager 
       .getRunningAppProcesses(); 
     Iterator<RunningAppProcessInfo> i = l.iterator(); 
     while (i.hasNext()) { 
      RunningAppProcessInfo info = i.next(); 

      if (info.uid == getApplicationInfo().uid && info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
       { 
        return true; 
       } 
      } 
     return false; 
    } 
+0

retourne vrai même si votre application est ouverte en mémoire. – Nativ

2

Je fini par avoir une variable statique que chaque activité met à true sur onResume et false sur .

ajouté ces méthodes sur une activité que toutes les autres activités s'étendent:

public abstract class AbstractActivity extends Activity 
    { 

    private static boolean isInForeground = false; 

    @Override 
     protected void onResume() 
    { 
     super.onResume(); 
     isInForeground = true; 
    } 


    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
     isInForeground = false; 
    } 

} 

Pour comprendre pourquoi cela fonctionne: Activity side-by-side lifecycle

Cela me donnera l'information si MON APP est sur le premier plan ou l'arrière-plan.

Mais encore Shailendra Rajawat est l'option plus standard ... parce que cela a des faiblesses:

  1. Il ne fonctionne que pour savoir si mon application PROPRE est au premier plan ou arrière-plan
  2. Il ne fonctionne pas si vous avez des activités transparentes. Comme le cycle de vie ne sera pas le même, onPause/onStop ne sera pas appelé lorsqu'une activité transparente est démarrée.
Questions connexes