4

从特定服务的代码中,我想确定该服务是否在前台。我看着:

ActivityManager.RunningServiceInfo

特别是 RunningServiceInfo.foreground,但文档说,“如果服务要求作为前台进程运行,则设置为 true。”

那么我可以依赖 RunningServiceInfo.foreground 吗?还是有其他方法?

PS:我没有其他问题,我的服务运行良好。这个问题更多是出于好奇。已经浏览过 ASOP 并没有看到任何东西,但也许我错过了一些东西......

如果您有类似的问题,这可能会有所帮助: 如何确定 Android 服务是否在前台运行?

...虽然我发现公认的解决方案是不完整的。

4

3 回答 3

0

我唯一能想到的是检查服务的进程重要性是否表明它正在运行前台服务或前台活动:

private boolean isForegroundOrForegroundService() {
    //Equivalent of RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE on API 23
    //On prior versions to API 23, maybe the OS just uses 100 as foreground service importance?
    int IMPORTANCE_FOREGROUND_SERVICE = 125;
    return findThisProcess().importance <= IMPORTANCE_FOREGROUND_SERVICE;
}

private ActivityManager.RunningAppProcessInfo findThisProcess() {
    List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
    for (ActivityManager.RunningAppProcessInfo proc : runningAppProcesses)
        if (proc.pid == Process.myPid())
            return proc;

    throw new RuntimeException("Couldn't find this process");
}

为此,有一些限制:

  • 该服务必须是进程中尝试在前台运行的唯一服务,否则您将不知道哪个服务导致进程进入前台模式。
  • 不能有任何活动在同一进程中运行,因为打开活动也会导致进程进入前台模式。
  • 出于与上述相同的原因,除了服务本身之外,没有其他任何东西可以使进程进入前台模式。

因此,您可能希望将服务置于其自己的专用进程中。不幸的是,这使您的应用程序结构变得困难,因为多进程应用程序开发比单进程复杂得多。

请注意,这主要是理论;我还没有测试过这么多,也没有在任何实际应用程序中使用过它。如果您采用这种方法,请告诉我情况如何。

于 2016-06-30T11:31:46.723 回答
-1

试试这个代码:

private boolean isActivityRunning() {
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
        ComponentName runningActivity = tasks.get(0).topActivity;
        return runningActivity.getPackageName().startsWith("com.mypackage");
    }
于 2013-09-10T19:09:56.993 回答
-3

如果我正确理解了您的问题并且我们假设前景意味着您的应用程序有一些活动,您可以在您的应用程序中声明全局静态变量,例如 boolean bIsForeground。在您的活动中,您可以设置:

@Override
protected void onResume() {
    super.onResume();
    bIsForeground = true;
}


@Override
protected void onPause() {
    super.onResume();
    bIsForeground = false;
}

因此,每次您的活动在前台或“屏幕上”时,此变量都应该为真,这样您的服务就可以知道前台处于活动状态。

于 2013-09-10T19:06:49.570 回答