我想检查我的应用是否在后台模式下运行。
问题是我有很多活动(列出活动,地图活动等)。最初我尝试过生命周期的恢复和暂停(或onUserLeaveHint
)方法,将静态布尔值设置为true或false,并以这种方式工作。但这显然不起作用,因为当我从一个活动转移到另一个活动时,前一个活动暂停。
另外,我在这里读过stackoverflow,getRunningTasks()
只能用于调试目的。我做了大量的研究,但我找不到解决方案。我想要做的就是能够检测应用程序是否在后台运行。任何人都可以给我一个方法,或表达我对如何做到这一点的想法?
答案 0 :(得分:2)
您可以在应用程序端而不是活动端尝试相同的机制(布尔属性)。创建一个扩展Application
的类,在<application android:name=YourClassApp>
下的清单文件中声明它。
编辑:我假设您知道activities
不是用于后台处理,否则您应该查看Services
。
答案 1 :(得分:1)
我不知道这是否会有所帮助,但您可以使用
getApplicaton().registerActivityLifecycleCallbacks(
yourClass );
了解您的活动在FG中的显示方式。 (对于较旧的s / w,can use this)
如果您的应用程序有服务,您可以使用静态get / set来访问静态变量。不要在活动中这样做,它会导致内存泄漏。
但实际上,如果您的应用程序正在运行,则没有任何整洁的跟踪方法。
答案 2 :(得分:0)
当覆盖Firebase推送消息的默认行为(仅在后台显示通知)时,我也遇到了同样的问题。我通过查看.class文件com.google.firebase.messaging.zzb:53检查了Firebase如何做到这一点( firebase-messaging:19.0.1),在我们看来是getRunningAppProcesses。请注意,您的FireBase是Google自己创建的。因此,我假设它非常节省使用。清理版本:
List<ActivityManager.RunningAppProcessInfo> runningApps;
boolean isInForeground =false;
if ((runningApps = ((ActivityManager)this.getApplication().getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses()) != null) {
Iterator runningApp = runningApps.iterator();
int myPid = Process.myPid();
while(runningApp.hasNext()) {
ActivityManager.RunningAppProcessInfo processInfo;
if ((processInfo = (ActivityManager.RunningAppProcessInfo)runningApp.next()).pid == myPid) {
isInForeground = processInfo.importance == 100;
break;
}
}
}