崩溃后重启无障碍服务

Restart Accessibility Service After Crash

在我的申请中有一个 Service 和一个 AccessibilityService。现在 Service 被无障碍服务绑定以接收信息。

我的 Service 定期检查 AccessibilityService 是否已启用,如果未启用,它会向用户发送通知,告知它必须启用它。

启用后,AccessibilityService 开始工作。首先绑定到我的Service,然后开始发送信息

问题是如果 AccessibilityService 崩溃了。它保持启用状态,但没有 运行 实例。所以我的 Service 发现它已启用但实际上 AccessibilityService 不是 运行.

如何检查AccessibilityService

public boolean checkAccesibilityService()
    {
        int accessibilityEnabled = 0;
        boolean accessibilityFound = false;
        try {
            accessibilityEnabled = Settings.Secure.getInt(
                    mContext.getApplicationContext().getContentResolver(),
                    android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
            //Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
        } catch (Settings.SettingNotFoundException e) {
            Log.e(TAG, "Error finding setting, default accessibility to not found: "
                    + e.getMessage());
        }

        if (accessibilityEnabled == 1) {
            //Log.v(TAG, "***ACCESSIBILIY IS ENABLED*** -----------------");
            String settingValue = Settings.Secure.getString(
                    mContext.getApplicationContext().getContentResolver(),
                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
            if (settingValue != null) {

                if(TextUtils.isEmpty(settingValue)) {
                    Log.i(TAG, "Nessun servizio abilitato!");
                    return false;
                }
                TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(':');
                splitter.setString(settingValue);

                while (splitter.hasNext()) {
                    String accessabilityService = splitter.next();

                    //Log.v(TAG, "-------------- > accessabilityService :: " + accessabilityService);
                    if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVCE)) {
                        //Log.v(TAG, "Accessibility Service Attivato!");
                        return true;
                    }
                }
                Log.v(TAG, "Accesibility Service non abilitato!");
                return false;
            }
        } else {
            Log.v(TAG, "***ACCESSIBILIY IS DISABLED***");
        }

        return accessibilityFound;

    }

Q1: 为什么 AccessibilityService 崩溃时 Android OS 不重启?

问题 2: 我可以更改我的代码以检查 AccessibilityService 是否已启用但也有一个 运行 实例吗?

为什么 AccessibilityService 崩溃时 Android OS 不重启?

我不知道,但我怀疑您对此无能为力。 AccessibilityServices 我也遇到过类似的问题,所以我认为这是正常行为。我能想到的最好的是:

  • 仔细编写您的 AccessibilityService 代码并对其进行全面测试,使其不包含任何会导致其崩溃的错误。
  • 不要在您的 AccessibilityService 中执行任何您也可以在其他地方执行的逻辑。您的 AccessibilityService 所做的工作越少,它就越简单,因此出现错误的可能性就越小。
  • 使您的 AccessibilityService 代码容错。预测将在服务内部发生的错误,并编写代码来捕获它们并从中恢复,以便 AccessibilityService 如果可能的话 运行 正常继续。
  • 运行 你的 AccessibilityService 在它自己的进程中,所以当你的其他代码崩溃时它不会被杀死。请注意,这可能很困难,具体取决于服务与其余代码的交互方式。

我可以更改我的代码以检查 AccessibilityService 是否已启用但还有一个 运行 实例吗?

是;有几种常用的技术可以做到这一点。参见 How to check if a service is running on Android?

您可以在 handleUncaughtException (Application Class) 中发生崩溃之前通过调用 disableSelf() 以编程方式关闭辅助功能服务;方法
但这仅适用于 Nogout 及更高版本。