Как программно запустить и остановить 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()), Это останавливает службу от получения событий специальных возможностей, но служба по-прежнему работает в фоновом режиме.

Смежные вопросы

2 ответа

Решение

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

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

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

Как указано в ответе Сэма, жизненный цикл 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
Другие вопросы по тегам