2015-09-03 1 views
2

J'ai la méthode suivante qui ne fonctionne pas avec précision pour le segment de code Lollipop. La méthode getRunningAppProcesses() renvoie toutes sortes de tâches système et renvoie également plusieurs résultats que je suis incapable de déterminer quel résultat représente l'équivalent d'utiliser getRunningTasks(1).get(0).topActivity.Comment savoir si l'application est en arrière-plan?

Comment cela est-il supposé être fait pour API 21 et plus?

public static boolean isAppInBackground(final Context context) { 
     ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 

     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { 
      List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses(); 
      if (!tasks.isEmpty()) { 
       for (ActivityManager.RunningAppProcessInfo fullTaskList : tasks) { 
        if (fullTaskList.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { 
         // NOTE: this condition needs to be changed because 
         // the list returns multiple results and not all 
         // the results represent IMPORTANCE_BACKGROUND 
         return true; 
        } 
       } 
      } 
     } else { 
      List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 
      if (!tasks.isEmpty()) { 
       ComponentName topActivity = tasks.get(0).topActivity; 
       if (!topActivity.getPackageName().equals(context.getPackageName())) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
+1

Cela peut être un peu d'aide: http: //stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l –

+0

Application Android est en cours d'exécution en arrière-plan] (http://stackoverflow.com/questions/3667022/checking-if-an-android-application-is-running-in-the-background) – cybersam

+0

@cybersam ce n'est pas un doublon thread que je pose la question d'un moyen de déterminer cela à travers une fonction, alors que ce fil est d'expliquer une solution en utilisant le modèle singleton et cycle de vie android. Je veux savoir spécifiquement, comment utiliser correctement getRunningAppProcessInfo(). – portfoliobuilder

Répondre

1

La solution la plus simple et direct que j'ai trouvé est le suivant:

public class AppStatusHelper { 
    private static final String TAG = AppStatusHelper.class.getSimpleName(); 

    private static int mNumOfActivitiesInOnStarttoOnStopLifeCycle=0; 

    public static void onStart() 
    { 
     mNumOfActivitiesInOnStarttoOnStopLifeCycle++; 
    } 
    public static void onStop() 
    { 
     mNumOfActivitiesInOnStarttoOnStopLifeCycle--; 
    } 

    public static boolean isAppInBackground() 
    { 
     Log.d(TAG,"num->"+mNumOfActivitiesInOnStarttoOnStopLifeCycle+"\tisOnBackground->"+(mNumOfActivitiesInOnStarttoOnStopLifeCycle==0)); 
     return mNumOfActivitiesInOnStarttoOnStopLifeCycle==0; 
    } 

} 

Il suffit d'appeler onStart à chaque démarrage de l'activité et onStop à chaque arrêt de l'activité. Ensuite, vérifiez si le compteur est égal à 0.