如何检测你的Android应用程序是否在前台(API 21)

时间:2014-10-19 23:07:21

标签: android google-cloud-messaging android-5.0-lollipop

收到GCM消息时,我的应用程序的行为取决于它是否在前台。在API 21之前,我使用了以下内容:

Boolean onForeground = this.getPackageName().equalsIgnoreCase(
            ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE))
            .getRunningTasks(1).get(0).topActivity.getPackageName()
);

现在,不推荐使用getRunningTasks(),并且在API 21上表现不同,那么API 21检测我的应用程序是否位于前台的最佳方法是什么?

Google建议

public ActivityManager.RecentTaskInfo getTaskInfo ()

但我不知道如何从那里获得我需要的信息。

提前谢谢。


编辑:正如@CommonsWare和@Chris Stratton所提议的那样,我可以跟踪onResume / onPause状态。 WebView(我无法控制的内容)导致的应用程序崩溃原因会导致系统处于错误状态。以错误的状态发送GCM会导致另一个崩溃让用户感到困惑(他/她当时没有对我的应用做任何事情)。

因此,我正在寻找另一种解决方案。 (我正在使用Fragments并且只有1个活动,所以实现这个将是微不足道的)

2 个答案:

答案 0 :(得分:6)

您可以使用{/ 3}}

  • 创建在您的清单中注册的BroadcastReceiver,用于执行背景行为
  • 在您的活动中以正优先级(默认为BroadcastReceiver)动态注册0,确保在onStart() / onResume()中注册并取消注册onStop() / onPause() - 这会影响前景行为并应调用ordered broadcast approach以确保未调用已注册的清单BroadcastReceiver

然后,您的GCM接收器可以使用abortBroadcast()发送广播(最好带有您的其他BroadcastReceiver注册的自定义动作),如果动态注册的接收器存在,它将被接收清单注册的接收者,如果它不存在。

答案 1 :(得分:2)

我使用getRunningAppProcesses

进行检测
boolean isOnForeground = true;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH)
{
    List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
    for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses)
    {
        if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
        {
            for (String activeProcess : processInfo.pkgList)
            {                                 if(activeProcess.equals(context.getPackageName()))
                {
                    isOnForeground = false;
                }
            }
        }
    }
}
else
{
     List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
     ComponentName componentInfo = taskInfo.get(0).topActivity;
                if(componentInfo.getPackageName().equals(context.getPackageName()))
     {
          isOnForeground = false;
     }
}