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