在 Android 12 中,getRunningServices()activityManager.getRunningAppProcesses() 方法已经不可用,但可以通过其他方法来查询本系统中是否开启了另一个包的服务。

一种方法是使用 PackageManager 类的 queryIntentServices() 方法来查询指定包名的服务是否存在。具体步骤如下:

  1. 获取 PackageManager 对象:PackageManager packageManager = context.getPackageManager();
  2. 创建一个 Intent 对象,指定要查询的服务的包名和服务名:Intent intent = new Intent('com.lerist.aidl.fakelocation.IMockLocationManager');
  3. 调用 PackageManagerqueryIntentServices() 方法,传入 Intent 对象和标志 PackageManager.GET_RESOLVED_FILTERList<ResolveInfo> resolveInfos = packageManager.queryIntentServices(intent, PackageManager.GET_RESOLVED_FILTER);
  4. 如果 resolveInfos 列表不为空,表示存在符合条件的服务。

另一种方法是使用 ActivityManager 类的 getRunningServiceControls() 方法来获取运行中的服务列表,并判断指定服务是否存在。具体步骤如下:

  1. 获取 ActivityManager 对象:ActivityManager activityManager = context.getSystemService(Context.ACTIVITY_SERVICE);
  2. 调用 ActivityManagergetRunningServiceControls() 方法获取运行中的服务列表:List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServiceControls(maxNum);
  3. 遍历 runningServices 列表,判断其中的 RunningServiceInfo 对象的 service.getClassName() 是否与指定服务的类名相同。

需要注意的是,以上方法需要在合适的上下文中调用,例如在 ActivityService 中。

以下是查询本系统中是否开启了另一个包的服务的示例代码:

PackageManager packageManager = getPackageManager();
Intent intent = new Intent('com.lerist.aidl.fakelocation.IMockLocationManager');
List<ResolveInfo> resolveInfos = packageManager.queryIntentServices(intent, PackageManager.GET_RESOLVED_FILTER);

if (resolveInfos != null && !resolveInfos.isEmpty()) {
    // 存在指定的服务
    // TODO: 处理逻辑
} else {
    // 不存在指定的服务
    // TODO: 处理逻辑
}
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServiceControls(maxNum);

boolean isServiceRunning = false;
for (ActivityManager.RunningServiceInfo runningService : runningServices) {
    if (runningService.service.getClassName().equals('com.lerist.aidl.fakelocation.IMockLocationManager')) {
        // 指定的服务正在运行中
        isServiceRunning = true;
        break;
    }
}

if (isServiceRunning) {
    // 服务正在运行中
    // TODO: 处理逻辑
} else {
    // 服务未运行
    // TODO: 处理逻辑
}

请根据你的具体需求选择合适的方法进行查询。

Android 12 中查询指定包名服务是否开启的方法

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

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