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

配置Glance Widget后provideGlance方法未触发问题求助

Glance Widget配置后provideGlance未触发的问题

我开发了一个Glance Widget,初始配置时会将若干ID保存至Shared Preferences,这些ID需要在provideGlance方法中读取。但即使调用了ValueWidget().update(context, glanceId)完成配置,provideGlance方法仍未被触发——日志显示该方法会在配置前被调用,但配置后完全没有响应。

Widget核心代码

class ValueWidget : GlanceAppWidget() {

   override suspend fun provideGlance(context: Context, id: GlanceId) {
        Timber.d("ValueWidget provideGlance: $id")
        val appWidgetId = GlanceAppWidgetManager(context).getAppWidgetId(glanceId = id)
        val elementIds = ValueWidgetUtils.loadElementIds(widgetId = appWidgetId, context)

        provideContent {
            Timber.d("ValueWidget provideContent: $id")
        }
  }
}

配置Activity代码

@AndroidEntryPoint
class ValueWidgetConfigureActivity : AppCompatActivity() {

    private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID

    public override fun onCreate(savedInstanceState: Bundle?) {
        enableEdgeToEdge()
        super.onCreate(savedInstanceState)

        // 设置默认返回结果为CANCELED,用户按返回键时会取消Widget添加
        setResult(RESULT_CANCELED)

        setContent {
            val coroutineScope = rememberCoroutineScope()

            AppTheme(
                darkTheme = ThemeUtils.isDarkMode(this)
            ) {
                SelectItemsView(
                    save = { elementIds ->
                        // 将选中的ID保存到Shared Preferences
                        ValueWidgetUtils.insertElementIds(appWidgetId, elementIds.toSet(), this)  
                        coroutineScope.launch {
                            val context = this@ValueWidgetConfigureActivity
                            val manager = GlanceAppWidgetManager(context)
                            val glanceId = manager.getGlanceIdBy(appWidgetId)

                            // 配置完成后更新Widget
                            ValueWidget().update(context, glanceId)
    
                            // 返回正确的Widget ID
                            val resultValue = Intent()
                            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
                            setResult(RESULT_OK, resultValue)
                            finish()
                        }
                    }
                )
            }
        }

        // 从Intent中获取Widget ID
        appWidgetId = intent?.extras?.getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID
        ) ?: AppWidgetManager.INVALID_APPWIDGET_ID

        // 如果没有获取到有效Widget ID,直接结束Activity
        if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            finish()
            return
        }
    }
}

临时方案的局限性

我曾尝试在provideGlance中加入循环等待逻辑作为临时解决办法,但该方案仅在首次添加Widget时有效,编辑Widget配置时完全不起作用:

var elementIds = ValueWidgetUtils.loadElementIds(appWidgetId, context)

while (elementIds.isEmpty()) {
    Timber.d("ValueWidget: No elements selected, waiting for selection")
    delay(1000)
    elementIds = ValueWidgetUtils.loadElementIds(appWidgetId, context)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:25:17