如何确定我的某个活动是否在前台

Mor*_*itz 59 android broadcastreceiver

我已经实现了一个由AlarmManager触发的BroadcastReceiver.AlarmManager在BOOT_COMPLETED上初始化.所以我必须在清单中声明接收器.

我的问题是我希望BroadcastReceiver只在我自己的活动都不在前台时做某事(也就是说用户没有与我的应用程序交互).我从远程服务器提取信息,并且不想通知用户他当前是否在我的应用程序中.

到目前为止,我还没有找到一种方法来确定我的应用程序是否在前台.有没有办法做这样的事情?ActivityManager告诉我我的应用程序是否正在运行,但不是它是否在前台.

问题与此处描述的几乎相同:只有在广播接收器处于前台时才通知它

解:

在评估了几个解决方案后,我想快速概述一下我认为在后台/前台处理活动的最佳方法.

首选方法是在活动的onResume方法中注册广播接收器,并在onPause上的活动上注销它.任何服务或其他背景元素都需要通过您的活动将拦截的特定操作发送广播意图.

如果您的活动位于前台,它将使其意向接收者注册,并能够直接处理您的服务发送的意图.如果它不在前台,它将不会接收到意图,但是调用广播的服务将知道没有人截获其广播意图并且能够自己处理它.例如,它可以启动所需的活动,显示通知等.

Ido*_*lon 27

以下答案:" 应用程序是否在后台运行 ",总结了可用于后台/前台检查的解决方案.

注意:
以前这个答案建议使用ActivityManager.getRunningAppProcesses(),但是这种方法似乎不完全可靠,不鼓励使用它.查看上面的链接了解详细信息.


Com*_*are 12

您的活动可以跟踪它自己的状态,看它是否在前台(将布尔设置为truein onStart(),falsein onStop()).唉,这个布尔值不会Activity自动提供给你.

  • @JorgeFuentesGonzález:这取决于你对"前景"的定义.`onPause()`/`onResume()`用于输入.`onStop()`/`onStart()`用于输出(可见性).由于这个问题已经有3年的历史了,我们无法从OP那里得到关于哪种情况有关的澄清.没有框架维护的标志,所以我的答案仍然存在(尽管我的`onStart()`/`onStop()`可能需要用`onResume()`/`onPause()`替换,具体取决于哪种情况一个想要). (6认同)
  • 正是这两个短语:`"活动的前景生命周期发生在对onResume()的调用之间,直到对onPause()的相应调用"`和`"如果一个活动失去焦点但仍然可见(即一个新的非全尺寸或透明的活动集中在你的活动之上),它被暂停."所以如果透明活动或半窗口活动出现在前面,你的活动不是前景,但是`onStop()`没有被调用. (2认同)