如何在Android 12及以上版本中查询另一个包的服务是否开启?

在Android 12及以上版本中,getRunningServices()以及activityManager.getRunningAppProcesses()方法已经不可用,queryIntentServices()返回为空内容:在安卓12及以上版本中,getRunningServices()和activityManager.getRunningAppProcesses()方法已被废弃,取而代之的是queryIntentServices()方法。然而,queryIntentServices()方法可能无法返回预期的结果,因为它只能查询已经注册在系统中的服务。

如果你想要查询另一个包中是否开启了服务,可以使用PackageManager类的queryIntentServices()方法结合ActivityManager类的getRunningServices()方法来实现。具体步骤如下:

  1. 使用PackageManager的queryIntentServices()方法查询指定服务名的服务是否存在。示例代码如下:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.lerist.aidl.fakelocation", "com.lerist.aidl.fakelocation.IMockLocationManager"));
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentServices(intent, PackageManager.GET_META_DATA);
  1. 使用ActivityManager的getRunningServices()方法查询当前正在运行的服务。示例代码如下:
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
  1. 遍历runningServices列表,判断服务的包名和类名是否与目标服务匹配。示例代码如下:
String targetPackageName = "com.lerist.aidl.fakelocation";
String targetClassName = "com.lerist.aidl.fakelocation.IMockLocationManager";

for (ActivityManager.RunningServiceInfo runningService : runningServices) {
    ComponentName serviceComponent = runningService.service;
    if (serviceComponent.getPackageName().equals(targetPackageName)
            && serviceComponent.getClassName().equals(targetClassName)) {
        // 目标服务已经开启
        break;
    }
}

需要注意的是,为了使用ActivityManager的getRunningServices()方法,你需要在AndroidManifest.xml文件中添加GET_TASKS权限:

<uses-permission android:name="android.permission.GET_TASKS" />

这是因为在安卓5.0及以上版本中,getRunningServices()方法需要该权限才能正常工作。

总结:在安卓12中,可以通过结合PackageManager的queryIntentServices()方法和ActivityManager的getRunningServices()方法来查询本系统中是否开启了另一个包的服务。但需要注意,queryIntentServices()方法可能无法返回预期的结果,因为它只能查询已经注册在系统中的服务。


原文地址: https://www.cveoy.top/t/topic/p3Fm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录