以降のセクションでは、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
メソッドを呼び出します。
context
と glanceId
を指定:
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 コルーチンをご覧ください。