我已经实现了一个由AlarmManager触发的BroadcastReceiver。 AlarmManager在BOOT_COMPLETED上初始化。所以我必须在清单中声明接收器。
我的问题是,我希望BroadcastReceiver只在我自己的活动都不在前台时做某事(也就是说用户没有与我的应用程序交互)。我从远程服务器提取信息,并且不希望通知用户他当前是否在我的应用程序中。
到目前为止,我还没有找到一种方法来确定我的应用程序是否在前台。有没有办法做这样的事情? ActivityManager告诉我我的应用程序是否正在运行,但不是它是否在前台。
问题与此处描述的几乎相同:Inform Activity from a BroadcastReceiver ONLY if it is in the foreground
SOLUTION:
在评估了几个解决方案之后,我想快速概述一下我认为处理后台/前台活动的最佳方法。
首选方法是在活动的onResume方法中注册广播接收器,并在onPause上的活动中注销它。任何服务或其他背景元素都需要通过您的活动将拦截的特定操作发送广播意图。
如果您的活动位于前台,它将使其意向接收者注册,并能够直接处理您的服务发送的意图。如果它不在前台,它将不会接收到意图,但是调用广播的服务将知道没有人截获其广播意图并且能够自己处理它。例如,它可以启动所需的活动,显示通知等。
答案 0 :(得分:27)
以下答案:“Is application running in background”,总结了可用于后台/前台检查的解决方案。
注意:强>
以前这个答案建议使用ActivityManager.getRunningAppProcesses()
,但是这种方法似乎并不完全可靠,不鼓励使用它。查看上面的链接了解详情。
答案 1 :(得分:12)
您的活动可以跟踪自己的状态,看它是否在前台(在true
中设置为onStart()
,在false
中设置为onStop()
)。唉,Activity
不会自动为您提供该布尔值。
答案 2 :(得分:4)
ActivityManager#getRunningAppProcesses()
会返回RunningAppProcessInfo
的列表。每个RunningAppProcessInfo
都有一个名为重要性的字段。等于RunningAppProcessInfo.IMPORTANCE_FOREGROUND
的重要性似乎表明用户正在积极观察哪些活动。还有RunningAppProcessInfo.IMPORTANCE_VISIBLE
较低但可能值得一试。
答案 3 :(得分:3)
查看我的解决方案,以确定活动是否在前台:http://www.mannaz.at/codebase/android-activity-foreground-surveillance/
将逻辑从“在前台”恢复到“不在前台”应该很容易。
答案 4 :(得分:3)
我已经实现了一个由AlarmManager触发的BroadcastReceiver。 AlarmManager在BOOT_COMPLETED上初始化。所以我必须在清单中声明接收器。
我的问题是,我希望BroadcastReceiver只在我自己的活动都不在前台时做某事(也就是说用户没有与我的应用程序交互)。我从远程服务器提取信息,并且不希望通知用户他当前是否在我的应用程序中。
到目前为止,我还没有找到一种方法来确定我的应用程序是否在前台。有没有办法做这样的事情? ActivityManager告诉我我的应用程序是否正在运行,但不知道它是否在前台。
似乎没有直接的方法来确定您的某个活动是否是当前正在运行的前台活动。但是,您可以通过使用有序广播和两个广播接收器来获得所需的效果。一个广播接收器需要在OnResume()中注册,并在OnPause()中注销。第二个广播接收器将在您的清单中声明,就像您已经完成的那样。为你的接收器设置android:priority,这样如果动态注册的接收器被注册,它将首先接收意图,然后你可以吃掉意图,这样你在清单中注册的广播接收器就不会被通知。
答案 5 :(得分:1)
你可以test if the window has focus - 但正如开发文档中所述,这与活动在前景中的情况不同。
答案 6 :(得分:1)
我会使用ActivityLifecycleCallbacks来获得更清晰的解决方案。
可以不安全,在您决定在生产中使用以下示例之前阅读this。它适用于我的设备和操作系统版本的“家庭开发”。
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;
}
在App
注册AndroidManifest
:
<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
}
}
}