【问题标题】:Identifying Stand-Alone Services on Android识别 Android 上的独立服务
【发布时间】:2015-01-22 18:24:47
【问题描述】:

我试图弄清楚是否有一种方法可以区分进程是应用程序还是独立服务(即 - 不是本地服务,而是在自己的进程中运行的服务)。

我正在使用 ActivityManager.getRunningAppProcesses 来获取正在运行的应用程序进程,并且还在使用 ActivityManager.getRunningServices 来获取正在运行的服务(不幸的是,getRunningTasks API 已被弃用)。

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

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

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

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

【问题讨论】:

    标签: android android-service


    【解决方案1】:

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

    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);
    }
    

    【讨论】:

      【解决方案2】:

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

      因此,您的问题并没有真正的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多