开发Android Wear无障碍服务:如何检测用户关闭服务?
解决Android Wear无障碍服务关闭状态检测的问题
我太懂你这个困扰了!Android无障碍服务的生命周期确实和普通Service不一样,你遇到的onDestroy()不触发是非常常见的情况——因为当用户在设置里关闭无障碍服务时,系统往往会直接干掉进程,根本不会走正常的销毁流程。下面给你几个可靠的检测方案:
方案一:监听系统无障碍设置变化(最推荐)
通过注册ContentObserver监听系统设置中无障碍服务的状态变化,这是最稳定的方式,因为它直接监听系统设置的修改,不受服务进程是否存活的影响(只要你的应用进程还在运行)。
代码实现示例
class MyWearAccessibilityService : AccessibilityService() { private lateinit var accessibilityStatusObserver: ContentObserver override fun onCreate() { super.onCreate() // 创建ContentObserver监听设置变化 accessibilityStatusObserver = object : ContentObserver(Handler(Looper.getMainLooper())) { override fun onChange(selfChange: Boolean) { super.onChange(selfChange) // 检查当前服务是否还处于启用状态 val isServiceEnabled = checkIfAccessibilityServiceEnabled(this@MyWearAccessibilityService) if (!isServiceEnabled) { // 服务已被关闭,执行你的功能禁用逻辑 disableRestrictedFeatures() } } } // 注册监听 contentResolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_ENABLED), true, accessibilityStatusObserver ) } // 工具方法:检查当前服务是否启用 private fun checkIfAccessibilityServiceEnabled(context: Context): Boolean { val serviceComponent = ComponentName(context, MyWearAccessibilityService::class.java) val enabledServicesStr = Settings.Secure.getString( context.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES ) ?: return false val enabledServices = enabledServicesStr.split(':') return enabledServices.any { it.equals(serviceComponent.flattenToString(), ignoreCase = true) } } override fun onDestroy() { super.onDestroy() // 记得取消注册,避免内存泄漏 contentResolver.unregisterContentObserver(accessibilityStatusObserver) } // 你自己的功能禁用逻辑 private fun disableRestrictedFeatures() { // 比如停止后台任务、重置相关状态等 } }
方案二:利用onUnbind()方法作为补充
虽然onDestroy()不可靠,但部分场景下系统会调用onUnbind(Intent)方法,你可以在这里再次检查服务状态,作为方案一的补充:
override fun onUnbind(intent: Intent?): Boolean { val isServiceEnabled = checkIfAccessibilityServiceEnabled(this) if (!isServiceEnabled) { disableRestrictedFeatures() } return super.onUnbind(intent) }
方案三:兜底处理(进程被直接杀死的情况)
如果系统直接杀死了服务进程,上面的方法可能都无法触发。这种情况下,你可以在应用的Application类或者下次启动的Activity中,检查无障碍服务的状态,然后同步禁用相关功能:
class MyWearApp : Application() { override fun onCreate() { super.onCreate() val isAccessibilityEnabled = checkIfAccessibilityServiceEnabled(this) if (!isAccessibilityEnabled) { disableRestrictedFeatures() } } // 复用之前的checkIfAccessibilityServiceEnabled方法 }
额外提示
在Android Wear设备上,因为系统资源有限,进程被回收的概率更高,所以方案一+方案三的组合基本能覆盖所有场景:用ContentObserver实时监听正常关闭操作,用应用启动时的检查处理进程被杀死的情况。
内容的提问来源于stack exchange,提问作者user3415167




