识别Android上的独立服务

识别Android上的独立服务,android,android-service,Android,Android Service,我试图找出是否有办法区分流程是应用程序还是独立服务(即,不是本地服务,而是在自己的流程中运行的服务) 我正在使用ActivityManager.getRunningAppProcesses获取正在运行的应用程序进程,同时也在使用ActivityManager.getRunningServices获取正在运行的服务(不幸的是,getRunningTasks API已被弃用) 当我比较两者的结果时,我发现两者中有许多相同的进程名&id(pid) 对于进程名称也存在于从RunningAppProces

我试图找出是否有办法区分流程是应用程序还是独立服务(即,不是本地服务,而是在自己的流程中运行的服务)

我正在使用ActivityManager.getRunningAppProcesses获取正在运行的应用程序进程,同时也在使用ActivityManager.getRunningServices获取正在运行的服务(不幸的是,getRunningTasks API已被弃用)

当我比较两者的结果时,我发现两者中有许多相同的进程名&id(pid)

对于进程名称也存在于从RunningAppProcess派生的列表中的服务,我必须假设这些服务是驻留在应用程序进程中的本地服务(如果我的假设错误,请告诉我)

要知道一个进程是否是独立服务,似乎唯一的方法是获取两个列表,然后从服务进程列表中删除PID与应用程序列表中的PID匹配的所有列表。结果将为我提供独立服务


有没有更简单的方法来获取此信息?

您只需使用
ActivityManager.getRunningServices
。这里有一个方法可以告诉您,结果中的每个
RunningServiceInfo
是否都有自己的进程。(为了避免每次都获取PackageManager,它也会传入)


进程可以承载不同的Android组件。在清单中,您告诉Android在哪个进程中放置每个组件。如果您愿意,您可以让Android为每个活动、服务、BroadcastReceiver和ContentProvider创建一个单独的流程。您还可以拥有一个承载某些服务和活动的流程,以及另一个承载其他服务和活动的流程

因此,你的问题实际上没有答案

private boolean serviceHasDifferentProcess(PackageManager pm, RunningServiceInfo rsi) throws PackageManager.NameNotFoundException {
    ComponentName cn = rsi.service;
    String pn = cn.getPackageName();
    PackageInfo pi = pm.getPackageInfo(pn, 0);
    ApplicationInfo ai = pi.applicationInfo;

    String serviceProcessName = rsi.process;
    String appProcessName = ai.processName;

    return serviceProcessName.equals(appProcessName);
}