背景
我有一个应用程序有一个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
使用AccessibilityServiceAccessibilityService停止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()时,辅助功能服务将停止。

07-27 17:10