我有一个AccessibilityService
的应用。 Android似乎一直在运行AccessibilityService
,但我只需要运行有时。 (具体来说,如果用户打开我的应用并将其关闭,则不再需要AccessibilityService
。)
如果我的AccessibilityService
在不需要时运行,则会浪费设备的RAM和CPU,我想尽可能避免对用户这样做。
如何以编程方式启动和停止AccessibilityService
?
请注意,我不要求以编程方式启用或禁用Android的辅助功能设置中的AccessibilityService
;这只是在它已经启用时启动和停止它。
AccessibilityService
)使用以下内容禁用AccessibilityService
组件:
PackageManager.setComponentEnabledSetting(
accessibilityServiceName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
0
);
这会杀死整个应用程序,包括AccessibilityService
。此外,重新启动手机后,Android辅助功能设置中不再显示AccessibilityService
。 (似乎需要重新启用该组件,然后重新启动手机才能让它再次显示。)
使用以下内容禁用AccessibilityService
组件:
PackageManager.setComponentEnabledSetting(
accessibilityServiceName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
);
这并没有阻止AccessibilityService
。
使用AccessibilityService
和Context.stopService()
停止Service.stopSelf()
。
这些并没有停止服务,大概是because the OS is bound to it。
使用AccessibilityService
杀死Process.killProcess()
的流程。但是,服务很快就重新启动并重新连接,大概是因为操作系统已经绑定了它。
使用AccessibilityService.setServiceInfo(new AccessibilityServiceInfo())
取消注册辅助功能事件。这会阻止服务获取辅助功能事件,但该服务仍在后台运行。
Can accessibility service be stopped or killed?
这只是关于停止服务。我希望能够在服务停止后再次启动服务。
答案 0 :(得分:1)
取自the Lifecycle section of the AccessibilityService
documentation:
可访问性服务的生命周期由系统专门管理,并遵循既定的服务生命周期。启动辅助功能服务仅由用户在设备设置中明确启用服务来触发。系统绑定到服务后,会调用
onServiceConnected()
。希望执行后绑定设置的客户端可以覆盖此方法。当用户在设备设置中将其关闭或拨打
disableSelf()
时,辅助功能服务会停止。
答案 1 :(得分:1)
正如Sam的回答所述,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