管理和更新 GlanceAppWidget

下面几部分介绍了如何更新 GlanceAppWidget 并管理其 状态。

管理GlanceAppWidget状态

每当 widget 被实例化时,提供的 GlanceAppWidget 类都会进行实例化。 因此应是无状态且被动的

状态的概念可以分为以下几个部分:

  • 应用状态:应用所要求的应用状态或内容 微件。例如,由 用户。
  • Glance 状态:仅与应用 widget 相关的特定状态 不一定会修改或影响应用的状态。例如, 复选框,或计数器增加。

使用应用状态

应用 widget 应处于被动状态。每个应用都负责管理 并处理状态,例如空闲、正在加载和错误反映 。

例如,以下代码会从内存中的 提供存储的目的地列表,以及 根据其状态显示不同的界面:

class DestinationAppWidget : GlanceAppWidget() {

    // ...

    @Composable
    fun MyContent() {
        val repository = remember { DestinationsRepository.getInstance() }
        // Retrieve the cache data everytime the content is refreshed
        val destinations by repository.destinations.collectAsState(State.Loading)

        when (destinations) {
            is State.Loading -> {
                // show loading content
            }

            is State.Error -> {
                // show widget error content
            }

            is State.Completed -> {
                // show the list of destinations
            }
        }
    }
}

每当状态或数据发生变化时,应用就负责通知 并更新该 widget。如需了解详情,请参阅更新 GlanceAppWidget

更新 GlanceAppWidget

管理 GlanceAppWidget 状态部分所述,应用 在不同进程中托管“资讯一览”会将内容翻译成 实际的 RemoteViews 并将其发送到主机。如需更新内容,请 必须重新创建 RemoteViews 并重新发送。

如需发送更新,请调用 GlanceAppWidget 实例的 update 方法, 提供 contextglanceId

MyAppWidget().update(context, glanceId)

如需获取 glanceId,请查询 GlanceAppWidgetManager

val manager = GlanceAppWidgetManager(context)
val widget = GlanceSizeModeWidget()
val glanceIds = manager.getGlanceIds(widget.javaClass)
glanceIds.forEach { glanceId ->
    widget.update(context, glanceId)
}

或者,使用 GlanceAppWidget update 扩展程序之一:

// Updates all placed instances of MyAppWidget
MyAppWidget().updateAll(context)

// Iterate over all placed instances of MyAppWidget and update if the state of
// the instance matches the given predicate
MyAppWidget().updateIf<State>(context) { state ->
    state == State.Completed
}

这些方法可以从应用的任何部分调用。因为它们 suspend 函数,我们建议在主线程之外启动它们 范围。在以下示例中,它们在 CoroutineWorker 中启动:

class DataSyncWorker(
    val context: Context,
    val params: WorkerParameters,
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        // Fetch data or do some work and then update all instance of your widget
        MyAppWidget().updateAll(context)
        return Result.success()
    }
}

如需详细了解协程,请参阅 Android 上的 Kotlin 协程