android - 应用强制停止后手动重新启用辅助功能服务不会重新启动

标签 android service accessibility accessibilityservice

在应用程序被强制停止然后再次手动打开后,我的辅助功能服务没有重新启动,这确实会重新启动其他常规服务。无障碍服务在手动重新启用(预期)、禁用和重新启用之前不会启动并再次工作第二次。 不幸的是,应用程序被杀死现在在非库存 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());
    }
    
    
  • 我将用户发送到设置以重新启用辅助功能服务。用户重新启用无障碍服务,但无障碍服务并没有重新启动! 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;
    }
    
    
  • 我尝试使用以下代码手动启动服务。这实际上会触发 onCreate 和 onStartCommand,但不会触发 onServiceConnected,并且不会收到可访问性事件。
    context.startService(new Intent(context, MyAccessibilityService.class));
    
    
  • 我在上面手动启动后尝试禁用该服务,以便用户被迫第二次重新启用它(这将修复它),但这不起作用:
    disableSelf();
    
    

  • 总之,用户认为他们已经重新启用了该服务,但它不起作用。重新启动设备或禁用服务并再次启用它确实可以解决它。
    有谁知道如何解决这个问题?当应用程序被强制停止时服务被禁用已经够糟糕了,但更糟糕的是即使用户手动重新启用它也不会启动。
    这是在 Android 11 上测试的。
    类似的问题:
    How to check if accessibility service crashed (Android Pie now displays this info in settings)?
    Restart Accessibility Service After Crash

    最佳答案

    我能够可靠地启动我的 AccessibilityService(没有 shortcut assigned )的唯一方法是通过 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
    
    但这似乎是一个系统的事情。您是否提出了 issue on the issue tracker ?

    关于android - 应用强制停止后手动重新启用辅助功能服务不会重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67410929/

    相关文章:

    android - android中现有类中的java.lang.NoClassDefFoundError

    java - 具有不同布局的 Android RecyclerView 不起作用

    if-statement - 如何检查服务是否通过批处理文件运行,如果服务未运行则将其停止?

    javascript - 如何制作易于理解的填写表格说明

    Android 辅助功能 - 无法专注于 Appbar 中的任何元素

    android - 一个 Physical Web Beacon 可以写入多少个 URL?

    Android - 如何修复 Widget 大小始终为 4x2

    java - 如何将值从 MainActivity 传递到 ServiceConnection?

    java - 聚合器模式,SOA(SplitJoin OSB)

    ios - 获取 iOS 上 VoiceOver 的当前速度