收到 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 上检测我的应用程序是否在前台的最佳方法是什么?
谷歌推荐
public ActivityManager.RecentTaskInfo getTaskInfo ()
但我不知道如何从那里获得我需要的信息。
提前谢谢你。
编辑:正如@CommonsWare 和@Chris Stratton 所提议的,我可以跟踪 onResume/onPause 状态。由 WebView(我无法控制的内容)引起的应用程序崩溃会使系统处于错误状态。发送处于这种错误状态的 GCM 会导致另一次崩溃,使用户感到困惑(他/她当时没有对我的应用执行任何操作)。
因此,我正在寻找另一种解决方案。 (我正在使用 fragment 并且只有 1 个 Activity ,所以实现这个很简单)
最佳答案
您可以使用 ordered broadcast approach你在哪里
- 创建一个在您的 list 中注册的
BroadcastReceiver
,它执行后台行为 - 在您的 Activity 中动态注册一个具有正优先级的
BroadcastReceiver
(默认为0
),确保在onStart()
中注册它>/onResume()
并在onStop()
/onPause()
中取消注册 - 这会执行前台行为并且应该调用 abortBroadcast()确保不调用 list 注册的BroadcastReceiver
然后您的 GCM 接收器可以使用 sendOrderedBroadcast()发送广播(最好使用您的其他 BroadcastReceiver
都注册的自定义操作),动态注册的接收器(如果存在)将被接收, list 注册的接收器(如果不存在)将被接收。
关于android - 如何检测您的 Android 应用程序是否在前台(API 21),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456398/