背景
我有一个应用程序有一个AccessibilityService
。android似乎一直在运行,但我有时只需要运行我的。(特别是,如果用户打开我的应用程序并将其关闭,则不再需要AccessibilityService
。)
如果我的AccessibilityService
在不需要的时候运行,那是在浪费设备的ram和cpu,如果可能的话,我想避免对我的用户这样做。
问题
如何以编程方式启动和停止我的AccessibilityService
?
请注意,我不是要求以编程方式启用或禁用android的辅助功能设置中的AccessibilityService
;这只是在它已经启用时启动和停止它。
我试过的(停止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
和AccessibilityService
停止Context.stopService()
。这些并没有停止服务,大概是
Service.stopSelf()
。使用because the OS is bound to it终止
AccessibilityService
的进程。但是,该服务在重新启动并重新连接之后不久,可能是因为操作系统已绑定到该服务。使用
Process.killProcess()
注销可访问性事件。这会阻止服务获取可访问性事件,但该服务仍在后台运行。相关问题
AccessibilityService.setServiceInfo(new AccessibilityServiceInfo())
这次只是为了停止服务。我想在服务停止后可以重新启动它。
最佳答案
摘自the Lifecycle section of the AccessibilityService
documentation:
无障碍服务的生命周期由系统独家管理,并遵循已建立的服务生命周期。启动辅助功能服务是由用户在“设备设置”中显式打开该服务以独占方式触发的。系统绑定到服务后,将调用onServiceConnected()
。此方法可以由要执行后期绑定设置的客户端重写。
当用户在“设备设置”中关闭辅助功能服务,或当它调用disableSelf()
时,辅助功能服务将停止。