android - 如何检测您的 Android 应用程序是否在前台(API 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 上检测我的应用程序是否在前台的最佳方法是什么?

谷歌推荐

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/

相关文章:

android - 无法使用node-xmpp客户端连接到GCM

android-animation - Android L "delightful"可绘制转换

android - Lollipop 中新的底部菜单的名称是什么

android - 使用 Android 从 SIM 卡获取 MSISDN

java - PreferenceActivity 中的工具栏设置

Android GCM 发送和 MismatchSenderId

android - 查看 SetAlpha 在 android 版本 5 中不工作 - lollipop

android - 在另一个 LinearLayout 中添加多个 LinearLayout 无法按预期工作

java - 我需要单击图像图标时可编辑格式的 AutoCompleteTextView

javascript - 从 GAS 发送 GCM 请求时为 "JSON_PARSING_ERROR: Unexpected character (d) at position 0."