崩溃后重新启动辅助功能服务

pao*_*988 4 service binding android accessibilityservice

在我的应用程序中有一个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;

    }
Run Code Online (Sandbox Code Playgroud)

Q1:为什么当AccessibilityService崩溃导致Android操作系统无法重启?

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

Sam*_*Sam 6

为什么当AccessibilityService崩溃导致Android操作系统无法重启?

我不知道,但我怀疑你能做的事情并不多.我有类似的问题AccessibilityService,所以我认为这是正常的行为.我能想到的最好的是:

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

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

是; 有几种常见的技术可以做到这一点.请参阅如何检查Android上是否正在运行服务?.