Как программно запустить и остановить 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