收到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个活动,所以实现这个将是微不足道的)
答案 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;
}
}