如何检查后台服务(在Android上)是否正在运行?
我想要一个能够切换服务状态的Android活动 - 它可以让我打开它,如果它打开则关闭.
是否有一种原生的android方法来从服务获取对当前运行的Activity的引用?
我有一个在后台运行的服务,我想在事件发生时(在服务中)更新我当前的Activity.有没有一种简单的方法(就像我上面建议的那样)?
我遇到的问题是,在应用程序被强制停止然后再次手动打开后,我的辅助功能服务无法重新启动,这确实会重新启动其他常规服务。在手动重新启用(预期)、禁用并再次重新启用之前,辅助服务不会启动并再次工作。 不幸的是,应用程序被杀死现在非常常见,非原生 Android 中内置了任务杀手。
概括:
强制停止应用程序会禁用辅助功能服务。这是预料之中的。当接下来使用以下代码手动打开应用程序时,我可以检测到辅助功能服务不再启用:
public static boolean isAccessibilityServiceEnabled(Context context) {
String prefString = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
return prefString != null && prefString.contains(context.getPackageName());
}
Run Code Online (Sandbox Code Playgroud)
我将用户发送到设置以重新启用辅助功能服务。用户重新启用无障碍服务,但无障碍服务不再启动!onCreate 不运行,onServiceConnected 不运行,未接收到辅助功能事件,以下代码将返回 false:
public static boolean isServiceRunning(Context context, Class targetService) {
List<ActivityManager.RunningServiceInfo> serviceInfos = getRunningServices(context);
String targetServiceName = targetService.getName();
for (ActivityManager.RunningServiceInfo serviceInfo : serviceInfos) {
if(serviceInfo.service.getClassName().equals(targetServiceName)) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的代码手动启动该服务。这实际上会触发 onCreate 和 onStartCommand,但不会触发 onServiceConnected,并且不会收到任何辅助功能事件。
context.startService(new Intent(context, MyAccessibilityService.class));
Run Code Online (Sandbox Code Playgroud)
我尝试在上面手动启动该服务后禁用该服务,以便用户被迫再次重新启用它(这将修复它),但这不起作用:
disableSelf();
Run Code Online (Sandbox Code Playgroud)
综上所述,用户认为自己重新启用了该服务,但并不起作用。重新启动设备或禁用该服务并再次重新启用它确实可以修复该问题。
有人知道如何解决这个问题吗?当应用程序被强制停止时,服务被禁用已经够糟糕的了,更糟糕的是,即使用户手动重新启用它也不会启动。
这是在 Android 11 上测试的。
类似问题: 如何检查辅助服务是否崩溃(Android …