Перезапустите службу специальных возможностей после сбоя

В моем приложении есть 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;

    }

Вопрос 1. Почему при сбое AccessibilityService ОС Android не перезапускает его?

Вопрос 2. Могу ли я изменить свой код, чтобы проверить, включен ли AccessibilityService, но есть ли при этом работающий экземпляр?


person paolo2988    schedule 22.08.2015    source источник


Ответы (2)


Почему при сбое AccessibilityService ОС Android не перезагружает его?

Я не знаю, но я подозреваю, что вы мало что можете с этим поделать. У меня были похожие проблемы с AccessibilityServices, поэтому я думаю, что это нормальное поведение. Лучшее, что я могу придумать, это:

  • Тщательно напишите свой AccessibilityService код и тщательно протестируйте его, чтобы он не содержал ошибок, которые могут привести к сбою.
  • Не используйте в своем AccessibilityService никакой логики, которую вы могли бы использовать в другом месте. Чем меньше работы выполняет ваш AccessibilityService, тем он проще и тем меньше вероятность наличия ошибок.
  • Сделайте свой код AccessibilityService устойчивым к ошибкам. Прогнозируйте ошибки, которые произойдут внутри службы, и напишите код для их обнаружения и восстановления после них, чтобы AccessibilityService продолжал нормально работать, если это возможно.
  • Запустите свой AccessibilityService в своем собственном процессе, чтобы он не был уничтожен при сбое другого кода. Обратите внимание, что это может быть сложно в зависимости от того, как служба взаимодействует с остальной частью вашего кода.

Могу ли я изменить свой код, чтобы проверить, включена ли служба AccessibilityService, но также есть ли работающий экземпляр?

Да; есть несколько общих методов, чтобы сделать это. См. Как проверить, работает ли служба на Android? .

person Sam    schedule 24.08.2015
comment
@ v1sc3rr4k, пожалуйста. Я только что отредактировал ответ, чтобы также предложить поместить AccessibilityService в свой собственный процесс, чтобы он не зависал при сбое другого кода. - person Sam; 02.10.2015
comment
@ v1sc3rr4k Можно ли запустить службу специальных возможностей в отдельном процессе? Моя служба не запускается, когда я даю имя процесса - person bhkiran; 18.01.2018
comment
@Sam, мне нужна твоя помощь по поводу службы доступности - person twana eng; 11.04.2020

Вы можете отключить службу специальных возможностей программно непосредственно перед тем, как произойдет сбой в handleUncaughtException ( Application Class ), вызвав disableSelf(); method
Но это работает только на Nogout и выше.

person Dhruv Kaushal    schedule 20.02.2018