Перезапустить службу доступности после сбоя

В моем приложении есть Service и AccessibilityService. Теперь Service привязан службой доступности для получения информации.

My 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, но также имеет запущенный экземпляр?

Ответ 1

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

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

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

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

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