检测Android应用程序是否在后台运行

时间:2013-01-25 12:53:56

标签: android

我想检查我的应用是否在后台模式下运行。

问题是我有很多活动(列出活动,地图活动等)。最初我尝试过生命周期的恢复和暂停(或onUserLeaveHint)方法,将静态布尔值设置为true或false,并以这种方式工作。但这显然不起作用,因为当我从一个活动转移到另一个活动时,前一个活动暂停。

另外,我在这里读过stackoverflow,getRunningTasks()只能用于调试目的。我做了大量的研究,但我找不到解决方案。我想要做的就是能够检测应用程序是否在后台运行。任何人都可以给我一个方法,或表达我对如何做到这一点的想法?

3 个答案:

答案 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;
                }
            }
        }