android - 崩溃后重启无障碍服务

标签 android service binding accessibilityservice

在我的应用程序中有一个 Service 和一个 AccessibilityService。现在 Service 被无障碍服务绑定(bind)以接收信息。

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

启用后,AccessibilityService 开始工作。首先它绑定(bind)到我的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 操作系统没有重启它?

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

最佳答案

为什么当 AccessibilityService 崩溃时 Android 操作系统不重启它?

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

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

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

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

关于android - 崩溃后重启无障碍服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157604/

相关文章:

android - 在 LINUX 上安装和配置 SQlite 浏览器

android - NestedScrollView 内的 ViewPager 内的 NestedScrollView : Innermost NestedScrollView not scrolling

linux - monit:无法识别的服务

android - 我们什么时候应该为对象选择 Lateinit ?将绑定(bind)设置为非可选和延迟初始化是一种不好的做法吗?

c# - Xamarin 表单绑定(bind)。如何根据某些条件显示 3 个不同字符串中的 1 个

android - 方向更改时出现内存不足错误

java - Android退出整个程序语法

java - 后台服务形状

WCF服务设计问题

c# - WPF 绑定(bind) - 空字符串的默认值