You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

开发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

火山引擎 最新活动