如何确定我的一项活动是否在前台

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

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

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

问题与这里描述的几乎相同: 从BroadcastReceiver通知活动只有在前台

解:

在评估了几个解决scheme后,我想快速勾画出我认为是处理背景/前景中活动的最佳方法。

首选方法是在您的活动的onResume方法中注册一个广播接收器,并注销onPause上的活动。 任何服务或其他背景元素将需要发送广播意图与您的活动将拦截的具体行动。

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

以下答案是:“ 应用程序在后台运行 ”,总结了可用于后台/前台检查的解决scheme。

注意:
以前这个答案build议使用ActivityManager.getRunningAppProcesses() ,但是这个方法似乎不是完全可靠的,并且它的用法是不鼓励的。 检查上面的链接的细节。

您的活动可以跟踪自己的状态,以确定它是否在前台(在onStart()中将boolean设置为trueonStart()中设置为false 。 唉,这个布尔值不是由Activity自动提供给你的。

ActivityManager#getRunningAppProcesses()返回一个RunningAppProcessInfo列表。 每个RunningAppProcessInfo都有一个称为重要性的字段。 等于RunningAppProcessInfo.IMPORTANCE_FOREGROUND重要性似乎显示用户正在主动观察哪个活动。 还有RunningAppProcessInfo.IMPORTANCE_VISIBLE这是较低,但可能值得检查。

检查我的解决scheme,以确定一个活动是否在前台: http : //www.mannaz.at/codebase/android-activity-foreground-surveillance/

将逻辑从“在前景”恢复到“不在前景”应该是容易的。

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

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

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

似乎没有直接的方法来确定你的一个活动是否是当前正在运行的前台活动。 但是,您可以通过使用有序的广播和两个广播接收机来获得所需的效果。 一个广播接收机需要在OnResume()中注册并在OnPause()中注销。 第二台广播接收机将在您的清单中声明,如您已经完成。 为您的接收机设置android:priority,如果dynamic注册的接收机被注册,它将首先收到意图,然后您可以吃掉意图,以便您在清单中注册的广播接收机从不被通知。

你可以testing窗口是否有焦点 – 但是正如开发文档中所说的那样,活动在前台是不一样的。

我会使用ActivityLifecycleCallbacks获得更干净的解决scheme。

可能是不安全的,在你决定在生产中使用下面的例子之前阅读这个 。 它适用于我的设备和操作系统版本的“家庭开发”。

 public class App extends Application implements Application.ActivityLifecycleCallbacks { private boolean inForeground; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityResumed(Activity activity) { inForeground = activity instanceof YourActivity; } public boolean isInForeground() { return inForeground; } 

AndroidManifest注册App

 <application android:name=".App" /> 

最后一块拼图:

 public class YourReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { App app = (App) context.getApplicationContext(); if(app.isInForeground()){ // do some stuff } } }