如何判断我的Android服务是否在前台运行?

4
从特定服务的代码中,我想要确定该服务是否在前台。我查看了 ActivityManager.RunningServiceInfo, 具体是 RunningServiceInfo.foreground,但文档上说,“如果该服务请求作为前台进程运行,则设置为 true。”所以我可以依赖 RunningServiceInfo.foreground 吗?或者还有其他方法吗?
PS:我的服务没有其他问题,它正在很好地运行。这个问题更多的是出于好奇。已经浏览了 ASOP,但没有找到任何东西,但也许我错过了什么...
如果你有类似的问题,这可能会有所帮助: 如何确定 Android 服务是否在前台运行? ...虽然我发现被接受的解决方案不完整。

我并不“需要”知道,只是好奇而已。我的服务运行良好 :) ……此外,我“需要”知道与解决方案有什么关系呢? - newbyca
有没有更好的方法或其他解决方案? - tyczj
1
请查看此处:https://dev59.com/eWw15IYBdhLWcg3wtN2O#6452570 - tyczj
谢谢,我已经看过了...不过我在那里留言说解决方案可能不完整。 - newbyca
“看看是否有更好的方法或其他解决方案吗?” … 抱歉,我觉得我已经解释清楚了,我没有其他问题。 - newbyca
显示剩余6条评论
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");
}

为了使其正常工作,有一些限制条件:

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

因此,您可能希望将服务放在自己的专用进程中。不幸的是,这会使您的应用程序结构变得复杂,因为多进程应用程序开发比单进程更加复杂。

请注意,这主要是理论;我没有在任何真实的应用程序中进行过多次测试或使用它。如果您采用这种方法,请告诉我它的效果如何。


-1

尝试这段代码:

private boolean isActivityRunning() {
        List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
        ComponentName runningActivity = tasks.get(0).topActivity;
        return runningActivity.getPackageName().startsWith("com.mypackage");
    }

-3

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

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


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接