You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose Glance Widget启用无障碍服务后不更新求助

问题解决:Glance Widget在无障碍服务启用后不自动更新

问题分析

你当前的代码中,在无障碍服务连接时调用MyAppWidget().updateAll()没有触发已添加Widget的刷新,核心原因有两点:

  1. 更新操作在IO协程执行,而Glance的Widget更新需要在主线程完成
  2. 直接调用updateAll可能无法正确遍历所有已添加的Widget实例,导致刷新不生效

解决方案

1. 修正无障碍服务中的Widget更新逻辑

将更新操作切换到主线程协程,通过GlanceAppWidgetManager获取所有已添加的Widget实例ID,逐个触发更新,确保每个Widget都能重新渲染。

修改后的MyAccessibilityService.kt代码:

class MyAccessibilityService : AccessibilityService() {

    companion object {
        private const val TAG = "MY_ACCESSIBILITY_SERVICE_TAG"
    }

    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        // some code
    }

    override fun onServiceConnected() {
        super.onServiceConnected()
        Log.i(TAG, "Service connected")

        // 使用MainScope确保更新操作在主线程执行
        MainScope().launch {
            Log.i(TAG, "Updating widget")
            val myWidget = MyAppWidget()
            val glanceManager = GlanceAppWidgetManager(this@MyAccessibilityService)
            // 获取所有已添加的当前Widget实例ID
            val glanceIds = glanceManager.getGlanceIds(myWidget::class.java)
            // 逐个更新每个Widget实例
            glanceIds.forEach { myWidget.update(this@MyAccessibilityService, it) }
        }
    }

    override fun onInterrupt() {
        Log.i(TAG, "Service interrupted")
    }
}

2. 验证无障碍服务状态判断逻辑

确保isManagerAndServicesEnabled扩展函数能正确识别当前应用的无障碍服务是否启用,示例实现如下(如果你的实现有问题,替换这段):

fun Context.isManagerAndServicesEnabled(manager: AccessibilityManager): Boolean {
    val enabledServices = manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK)
    val targetServiceName = "${packageName}.${MyAccessibilityService::class.java.simpleName}"
    return enabledServices.any {
        it.resolveInfo.serviceInfo.name == targetServiceName
    }
}

3. 额外检查

  • 确保MyAppWidget已在Manifest中正确注册Widget Provider
  • 确认无障碍服务的权限配置完整,用户已授予相应权限

原理说明

通过GlanceAppWidgetManager可以精准获取所有已添加到主屏幕的当前Widget实例,逐个调用update方法能强制触发每个Widget的provideGlance重新执行,从而根据最新的无障碍服务状态更新UI。同时将更新操作放在主线程协程,符合Glance的UI更新要求。

内容的提问来源于stack exchange,提问作者Mervin Hemaraju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:44