Android 12 中查询指定包的服务是否开启
在 Android 12 中,getRunningServices() 和 activityManager.getRunningAppProcesses() 方法已经不可用,但可以使用新的方法来查询本系统中是否开启了另一个包的服务。以下是一种可能的解决方案:
- 使用
PackageManager的queryIntentServices()方法查询是否存在指定的服务。该方法会返回一个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 {
// 服务不存在
}
- 可以通过查询已安装应用的列表,判断目标应用是否在运行。如果目标应用在运行,那么可以进一步判断该应用是否有前台服务或后台服务。
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 {
// 未获取到运行中的应用列表
}
请注意,以上代码仅提供一种可能的解决方案,具体实现可能需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/p3BU 著作权归作者所有。请勿转载和采集!