GlanceAppWidget を管理、更新する

以降のセクションでは、GlanceAppWidget を更新してその管理を行う方法について説明します。 あります。

GlanceAppWidget の状態を管理する

ウィジェットが呼び出されるたびに、指定された GlanceAppWidget クラスがインスタンス化されます。 更新が必要なため、ステートレスかつパッシブにする必要があります。

状態の概念は次のように分類できます。

  • アプリケーションの状態: 追加します。たとえば、 できます。
  • Glance の状態: アプリ ウィジェットのみに関係のある特定の状態です。 必ずしもアプリの状態を変更したり、影響を与えたりするものではありません。たとえば、 ウィジェットでチェックボックスが選択されたか、カウンタが増加しました。

アプリケーションの状態を使用する

アプリ ウィジェットはパッシブである必要があります。各アプリケーションは、アプリケーションの 状態(アイドル状態、読み込み中、エラーの反映など)の処理 。

たとえば、次のコードは、インメモリからデスティネーションを取得します。 リポジトリ レイヤからキャッシュし、保存された宛先のリストを提供します。 状態に応じて異なる UI を表示します。

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
            }
        }
    }
}

状態やデータが変更されるたびに、アプリがその状態やデータを ウィジェットを更新します詳しくは、GlanceAppWidget を更新するをご覧ください。

GlanceAppWidget を更新します

GlanceAppWidget の状態を管理するで説明したように、アプリは ウィジェットは別のプロセスでホストされます。Glance はコンテンツを翻訳し 実際の 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 コルーチンをご覧ください。