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

时间:2015-08-22 15:07:13

标签: android service binding 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;

    }

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

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

2 个答案:

答案 0 :(得分:6)

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

我不知道,但我怀疑你无法做到这一点。我与AccessibilityService有类似的问题,所以我认为这是正常行为。我能想到的最好的是:

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

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

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

答案 1 :(得分:0)

您可以通过调用disableSelf()在handleUncaughtException(Application Class)中发生崩溃之前以编程方式关闭Accessibility Service。方法
但这只适用于Nogout及以上版本。