1

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

问题是我有很多活动(列表活动、地图活动等)。最初,我尝试在生命周期的 resume 和 pause( 或onUserLeaveHint) 方法中将静态布尔值设置为 true 或 false 并以这种方式工作。但这显然行不通,因为当我从一项活动转移到另一项活动时,前一项活动会暂停。

另外,我在 stackoverflow 上读到getRunningTasks()应该仅用于调试目的。我进行了大量研究,但找不到解决方案。我想做的就是能够检测应用程序是否在后台运行。任何人都可以向我提出一种方法,或表达任何关于我该怎么做的想法吗?

4

3 回答 3

2

您可以尝试相同的机制(布尔属性),但在应用程序端而不是活动端。创建一个扩展类,Application在清单文件中声明它<application android:name=YourClassApp>

编辑:我假设您知道这activities不适用于后台处理,如果不是,您应该查看Services.

于 2013-01-25T13:01:56.530 回答
1

我不知道这是否会有所帮助,但您可以使用

getApplicaton().registerActivityLifecycleCallbacks(你的班);

鸟瞰您的活动在 FG 中的显示方式。(对于较旧的软件,您可以使用它


如果您的应用程序有一个服务,您可以有一个访问静态变量的静态 get/set。但是不要在活动中这样做,它会导致内存泄漏。

但实际上,如果您的应用程序正在运行,则没有一种整洁的方法可以跟踪。

于 2013-01-25T13:48:24.100 回答
0

我在覆盖 Firebase 推送消息默认行为时遇到了同样的问题(仅在后台显示通知)我通过查看 .class 文件 com.google.firebase.messaging.zzb:53(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;
                }
            }
        }
于 2019-08-01T14:42:33.590 回答