在崩溃之后重新启动无障碍服务

7
在我的应用程序中,有一个服务(Service)和一个无障碍服务(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 操作系统不会重新启动它?

Q2: 我能否更改我的代码以检查 AccessibilityService 是否已启用并且是否有正在运行的实例?

2个回答

7
为什么当AccessibilityService崩溃时,Android操作系统不会重新启动它?
我不知道,但我怀疑你对此无能为力。我曾经遇到过类似AccessibilityService的问题,所以我认为这是正常行为。我能想到的最好方法是:
- 仔细编写您的AccessibilityService代码并进行彻底测试,以确保它不包含任何会导致崩溃的错误。 - 不要在AccessibilityService中执行任何逻辑,您也可以在其他地方执行该逻辑。AccessibilityService执行的工作越少,它就越简单,因此出现错误的可能性就越小。 - 使您的AccessibilityService代码容错。预测服务内部将发生的错误,并编写代码来捕获和恢复这些错误,以便AccessibilityService在可能的情况下继续正常运行。 - 在其自己的进程中运行您的AccessibilityService,以便在其他代码崩溃时不会被杀死。请注意,这可能会取决于服务与您的其他代码交互的方式。

我能修改我的代码以检查AccessibilityService是否已启用且是否有运行实例吗?

可以的;有几种常见的技巧可以实现这个功能。请参见如何检查Android上的服务是否正在运行?


1
@v1sc3rr4k,不用谢。我刚刚编辑了答案,也建议将AccessibilityService放在自己的进程中,这样当您的其他代码崩溃时它不会崩溃。 - Sam
1
@v1sc3rr4k 是否可以在单独的进程中运行辅助功能服务? 当我指定进程名称时,我的服务无法启动。 - bhkiran
@Sam,我需要你关于无障碍服务的帮助。 - twana eng

2
在处理未捕获的异常时(应用程序类),您可以通过调用disableSelf()方法编程方式关闭无障碍服务,以防崩溃发生。但这仅适用于Nougat及以上版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接