我唯一能想到的是检查服务的进程重要性是否表明它正在运行前台服务或前台活动:
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");
}
为此,有一些限制:
- 该服务必须是进程中尝试在前台运行的唯一服务,否则您将不知道哪个服务导致进程进入前台模式。
- 不能有任何活动在同一进程中运行,因为打开活动也会导致进程进入前台模式。
- 出于与上述相同的原因,除了服务本身之外,没有其他任何东西可以使进程进入前台模式。
因此,您可能希望将服务置于其自己的专用进程中。不幸的是,这使您的应用程序结构变得困难,因为多进程应用程序开发比单进程复杂得多。
请注意,这主要是理论;我还没有测试过这么多,也没有在任何实际应用程序中使用过它。如果您采用这种方法,请告诉我情况如何。