Как программно запустить и остановить AccessibilityService?

Задний план

У меня есть приложение с AccessibilityService. Кажется, Android постоянно поддерживает AccessibilityService, но мне нужно только мой запускался иногда. (В частности, если пользователь открывает мое приложение и выключает его, AccessibilityService уже не нужен)

Если мой AccessibilityService работает, когда он не нужен, он тратит ОЗУ и ЦП устройства, и я хочу по возможности не делать этого для своих пользователей.

Вопрос

Как программно запустить и остановить мой AccessibilityService?

Обратите внимание, что я не прошу программно включить или отключить AccessibilityService в настройках специальных возможностей Android; это просто запуск и остановка, когда он уже включен.

Что я пробовал (остановка AccessibilityService)

  • Отключение компонента AccessibilityService с помощью следующего:

    PackageManager.setComponentEnabledSetting(
        accessibilityServiceName,
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        0
    );
    

    Это убило все приложение, включая AccessibilityService. Кроме того, после перезагрузки телефона AccessibilityService больше не отображался в Настройки специальных возможностей Android. (Похоже, что компонент необходимо повторно включить, а затем перезагрузить телефон, чтобы он снова появился.)

  • Отключение компонента AccessibilityService с помощью следующего:

    PackageManager.setComponentEnabledSetting(
        accessibilityServiceName,
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP
    );
    

    Это не остановило AccessibilityService.

  • Остановка AccessibilityService с помощью Context.stopService() и Service.stopSelf(). Это не остановило службу, предположительно потому что ОС привязана к нему.

  • Уничтожение процесса AccessibilityService с помощью Process.killProcess(). Однако вскоре служба была перезапущена и снова подключена, предположительно, потому, что ОС привязана к ней.

  • Отмена регистрации событий доступности с помощью AccessibilityService.setServiceInfo(new AccessibilityServiceInfo()) . Это останавливает службу от получения событий доступности, но служба по-прежнему работает в фоновом режиме.

Похожие вопросы


person Sam    schedule 05.11.2016    source источник
comment
Не могли бы вы поделиться минимальным проектом, чтобы мы могли его попробовать?   -  person android developer    schedule 05.11.2016


Ответы (2)


Взято из раздела Жизненный цикл AccessibilityService документации:

Жизненный цикл службы доступности управляется исключительно системой и следует установленному жизненному циклу службы. Запуск службы специальных возможностей запускается исключительно пользователем, явно включившим службу в настройках устройства. После привязки системы к службе она вызывает onServiceConnected(). Этот метод может быть переопределен клиентами, которые хотят выполнить настройку пост-привязки.

Служба специальных возможностей останавливается, когда пользователь отключает ее в настройках устройства или когда она вызывает disableSelf() (в Android 7.0 (API 24) и более поздних версиях).

person Sam    schedule 19.11.2016

Как указано в ответе Сэма, жизненный цикл AccessibilityService управляется исключительно системой, поэтому вы не можете его убить.

Но помимо целей оптимизации ресурсов, если вам все еще нужно запустить/остановить работу AccessibilityService в некоторых обстоятельствах, вы можете просто использовать старый добрый SharedPreferences.

onAccessibilityEvent вашей службы должно быть:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    if (prefs.getBoolean("isServiceEnabled", true)){
        /*
        * Your code goes here
        */
    }
}

Если вы хотите «выключить/включить» службу, вы можете сделать это, просто написав это в onClickListener какой-нибудь кнопки или где-нибудь еще в соответствии с вашими потребностями:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

prefs.edit().putBoolean("isServiceEnabled", false).apply(); // disable

prefs.edit().putBoolean("isServiceEnabled", true).apply();  // enable
person Drilon Kurti    schedule 25.09.2017
comment
Логическая статическая переменная была бы намного эффективнее. - person ; 02.01.2018
comment
На самом деле, начиная с API 24, это возможно: developer.android.com /reference/android/accessibilityservice/ - person android developer; 14.06.2020