应用程序强制停止后手动重新启用时,辅助功能服务不会重新启动

Fly*_*iew 6 service android accessibility accessibilityservice

我遇到的问题是,在应用程序被强制停止然后再次手动打开后,我的辅助功能服务无法重新启动,这确实会重新启动其他常规服务。在手动重新启用(预期)、禁用并再次重新启用之前,辅助服务不会启动并再次工作 不幸的是,应用程序被杀死现在非常常见,非原生 Android 中内置了任务杀手。

概括:

  1. 强制停止应用程序会禁用辅助功能服务。这是预料之中的。当接下来使用以下代码手动打开应用程序时,我可以检测到辅助功能服务不再启用:

    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)
  2. 我将用户发送到设置以重新启用辅助功能服务。用户重新启用无障碍服务,但无障碍服务不再启动!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)
  1. 我尝试使用下面的代码手动启动该服务。这实际上会触发 onCreate 和 onStartCommand,但不会触发 onServiceConnected,并且不会收到任何辅助功能事件。

    context.startService(new Intent(context, MyAccessibilityService.class));
    
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我尝试在上面手动启动该服务后禁用该服务,以便用户被迫再次重新启用它(这将修复它),但这不起作用:

    disableSelf();
    
    
    Run Code Online (Sandbox Code Playgroud)

综上所述,用户认为自己重新启用了该服务,但并不起作用。重新启动设备或禁用该服务并再次重新启用它确实可以修复该问题。

有人知道如何解决这个问题吗?当应用程序被强制停止时,服务被禁用已经够糟糕的了,更糟糕的是,即使用户手动重新启用它也不会启动。

这是在 Android 11 上测试的。

类似问题: 如何检查辅助服务是否崩溃(Android Pie 现在在设置中显示此信息)?

崩溃后重新启动辅助服务

Qui*_*don 0

我能够可靠地启动 AccessibilityService (没有分配快捷方式)的唯一方法是通过 ADB:

#!/bin/sh
VALUE_OFF="com.android.talkback/com.google.android.marvin.talkback.TalkBackService"
TALKBACK="com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService"
ALLYSERVICE="[myservicename]"
VALUE_ON="$TALKBACK:$ALLYSERVICE"

if [ "$ENABLE" = true ]; then
  adb shell settings put secure enabled_accessibility_services $VALUE_ON
  adb shell settings put secure accessibility_enabled 1
else
  adb shell settings put secure enabled_accessibility_services $VALUE_OFF
  adb shell settings put secure accessibility_enabled 0
fi
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个系统问题。您是否在问题跟踪器上提出过问题