GlanceAppWidget 관리 및 업데이트

다음 섹션에서는 GlanceAppWidget를 업데이트하고 이를 관리하는 방법을 설명합니다. 있습니다.

GlanceAppWidget 상태 관리

제공된 GlanceAppWidget 클래스는 위젯이 다음과 같을 때마다 인스턴스화됩니다. 업데이트가 필요하거나 스테이트리스(Stateless) 및 수동이어야 합니다.

상태의 개념은 다음과 같이 나눌 수 있습니다.

  • 애플리케이션 상태: 앱에서 요구하는 앱의 상태 또는 콘텐츠는 위젯에 추가합니다. 예를 들어 있습니다.
  • Glance state: 앱 위젯에만 관련된 특정 상태입니다. 앱의 상태를 수정하거나 영향을 주지는 않습니다. 예를 들어 체크박스가 선택되었거나 카운터가 늘어났습니다.

애플리케이션 상태 사용

앱 위젯은 수동적이어야 합니다. 각 애플리케이션은 데이터 영역 및 상태 처리(예: 유휴, 로드, 오류 반영) 사용할 수 있습니다.

예를 들어 다음 코드는 인메모리에서 대상을 검색합니다. 캐시하고 대상의 저장된 목록을 제공하며 상태에 따라 다른 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를 생성하고 이를 호스트로 전송합니다. 콘텐츠를 업데이트하려면 Glance 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
}

애플리케이션의 모든 부분에서 이러한 메서드를 호출할 수 있습니다. Kubernetes는 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 코루틴을 참고하세요.