确定前台的应用程序是否是不受欢迎的?

Tal*_*nel 3 android application-lifecycle activity-lifecycle

检测应用程序是否在前台有很多原因.例如 - 作为GCM/C2DM推送通知的触发器 - 当应用程序是前台和后台时,许多应用程序将有充分的理由实现不同的行为.其他原因可能是 - 淘汰消耗宝贵资源的服务,例如在后台任务中查询服务器.

需要明确的是:后台app的定义(我认为)是:
应用程序,它没有调用任何活动onStart()方法,也没有调用onStop()方法.那是因为活动只在那个时候在生命周期中对用户可见.

从另一方面 -

  • 似乎Google不希望应用程序对主页按钮作出反应(它不是API的一部分)

  • onBackPressed()对"root/main"活动作出反应作为指示离开Activity肯定不是一个好主意(因为很多用户使用主页按钮,而不是后退按钮)

  • API中没有方法可以确定app是否为前景(根据我的定义..)

如果我没有错过API中的某些内容,而且确实如此 - 为什么没有原因可以轻松确定应用程序是否为前景???? !!!!

我知道我可以做的是确定应用程序是否为前景在此主题中描述 - 如何检测Android应用程序何时进入后台并返回到前台

但正如@Emil所说 - 它需要特殊许可,或者需要一些棘手的逻辑,这些逻辑很快就会成为维护的问题,并且它闻起来像是糟糕的方法(虽然这就是我现在正在做的事情,因为我没有更好的想法. ..)

我的问题基本上是:

  • 有充分理由没有这样的API方法吗?

  • 是否考虑应用程序是否为前景是一种不好的方法?

  • 有没有其他方法可以知道应用程序是否是前景?

Com*_*are 5

如果应用程序是前景或不是一个坏方法,考虑到?

考虑前景与背景是合理的.

有没有其他方法可以知道应用程序是否是前景?

您可以将此方案粗略地分为两组:

  1. 您希望在更改前景/后台状态时立即采取操作的情况

  2. 发生某些其他事件的情况(AlarmManager警报,传入系统广播等),此时您希望根据您是否在前台采取不同的操作

在前一种情况下,onUserLeaveHint()是您最可靠的简单选择.我无法保证它将涵盖所有情况,但它应该处理HOME场景,例如.您也可以在静态数据成员中维护已启动活动的引用计数,并尝试使用它.

在后一种情况下,有序广播可能是有用的.