在 Android 12 中,getRunningServices()activityManager.getRunningAppProcesses() 方法已经不可用,但可以使用新的方法来查询本系统中是否开启了另一个包的服务。以下是一种可能的解决方案:

  1. 使用 PackageManagerqueryIntentServices() 方法查询是否存在指定的服务。该方法会返回一个 ResolveInfo 列表,包含了所有匹配的服务信息。
String packageName = "com.lerist.aidl.fakelocation";
String serviceName = "com.lerist.aidl.fakelocation.IMockLocationManager";

PackageManager packageManager = getPackageManager();
Intent intent = new Intent();
intent.setClassName(packageName, serviceName);
List<ResolveInfo> resolveInfos = packageManager.queryIntentServices(intent, 0);

if (resolveInfos != null && !resolveInfos.isEmpty()) {
    // 服务存在
} else {
    // 服务不存在
}
  1. 可以通过查询已安装应用的列表,判断目标应用是否在运行。如果目标应用在运行,那么可以进一步判断该应用是否有前台服务或后台服务。
String packageName = "com.lerist.aidl.fakelocation";

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();

if (runningAppProcesses != null && !runningAppProcesses.isEmpty()) {
    for (ActivityManager.RunningAppProcessInfo processInfo : runningAppProcesses) {
        if (processInfo.processName.equals(packageName)) {
            // 目标应用正在运行
            boolean hasForegroundService = (processInfo.flags & ActivityManager.RunningAppProcessInfo.FLAG_FOREGROUND_SERVICE) != 0;
            boolean hasBackgroundService = (processInfo.flags & ActivityManager.RunningAppProcessInfo.FLAG_RECEIVE_WALLET) != 0;

            if (hasForegroundService || hasBackgroundService) {
                // 目标应用有前台服务或后台服务
            } else {
                // 目标应用没有前台服务或后台服务
            }

            break;
        }
    }
} else {
    // 未获取到运行中的应用列表
}

请注意,以上代码仅提供一种可能的解决方案,具体实现可能需要根据实际情况进行调整。

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

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

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