Android Glance UI 갱신하는 방법 - PreferencesGlanceStateDefinition

2025. 5. 22. 15:27· Development/Android
반응형

- Glance에서 어떤 동작을 수행하고 나서 위젯을 업데이트하기 위해 아래와 같은 로직을 호출했다.

CoroutineScope(Dispatchers.IO).launch {
    val manager = GlanceAppWidgetManager(context)
    widgetList.forEach { (widgetClass, stateKey) ->
        val glanceIds = manager.getGlanceIds(widgetClass)
        val widgetInstance = widgetClass.getDeclaredConstructor().newInstance()
        glanceIds.forEach { glanceId ->
            widgetInstance.update(context, glanceId)
        }
    }
}

 

- 하지만 데이터는 수정되어도 UI가 갱신되지 않는 문제가 발견되었다.

 

- 그 이유는 위젯 내부에서 갖고 있는 UiState 자체가 변경되지 않아 데이터는 바뀌었어도 UI는 갱신하겠다는 트리거를 받지 못해서다. Glance는 상태 변화가 없으면 렌더링을 생략한다.

 

- 이를 위해 PreferencesGlanceStateDefinition 개념을 사용해야 한다. 

 

- PreferencesGlanceStateDefinition은 Glance 위젯에서 상태를 키 - 값 형태로 저장하고 불러오기 위한 기본 저장소 구현체다. 즉, Glance 위젯 전용의 SharedPreferences 같은 역할을 한다고 보면 된다.

 

- 그리고 키에 해당하는 값을 변경함으로서 하위 컴포저블에 대한 refresh를 진행할 수 있다.

 

- 위젯 전체 UI를 다시 그리기 위해 provideContent {} 상단에 currentState()로 현재 State 저장 값을 확인한다.

provideContent {
    val updatedTime = currentState(key = GlanceUpdateKey) ?: 0L
    WidgetLayout(updatedTime)
}

 

- 이제 currentState 관측 지점부터 UI 갱신이 발생할 수 있게 구성되었다. 단순하게 현재 시간 값을 경신하는 타입을 State로 선언했다.

 

- GlanceUpdateKey 같은 경우에는 임의의 값이고 object 등으로 정리해두면 파악하기에 용이할 듯하다.

 

- WidgetLayout 컴포저블 내부에 어떤 버튼이 있고, 이 버튼을 click 하면 RefreshAction을 발생시키도록 하려고 한다. 그러면 아래처럼 ActionClass를 구성해 주면 되겠다.

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        CoroutineScope(Dispatchers.IO).launch {
            val manager = GlanceAppWidgetManager(context)
            val now = System.currentTimeMillis()
            widgetList.forEach { (widgetClass, stateKey) ->
                val glanceIds = manager.getGlanceIds(widgetClass)
                val widgetInstance = widgetClass.getDeclaredConstructor().newInstance()
                glanceIds.forEach { glanceId ->
                    updateAppWidgetState(context, PreferencesGlanceStateDefinition, glanceId) {
                        it.toMutablePreferences().apply { this[stateKey] = now }
                    }
                    widgetInstance.update(context, glanceId)
                }
            }
        }
    }
}

- widgetUpdateState를 통해 해당 키 - 값에 접근하여 값을 최신화하고, widgetInstance의 update 호출을 통해 완전한 위젯 갱신을 구현할 수 있다.

반응형
저작자표시 (새창열림)
'Development/Android' 카테고리의 다른 글
  • [Android] ScrollView 최상단으로 자동 스크롤하기
  • 외부 웹 사이트에서 내 앱으로 공유 기능 활성화하기 - Intent Sharing
  • Android Glance에서 Activity 열기 및 특정 로직 수행 (ActionCallBack, StartActivityIntentAction)
  • Android Glance Widget에서 SizeMode에 관하여 (위젯 크기에 따라 View에 변화 주기)
SeungYong.Lee
SeungYong.Lee
반응형
SeungYong.Lee
Win-Dev
SeungYong.Lee
전체
오늘
어제
  • All (229)
    • Development (129)
      • Android (125)
      • iOS (0)
      • Flutter (4)
      • Backend (0)
    • Algorithm (5)
    • Knowledge (5)
      • IT (2)
      • Science (0)
      • ETC & Tip (3)
    • Today I Learn (28)
    • Coding Test (62)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 안녕하세요. 반갑습니다 :)

인기 글

태그

  • glance
  • 프로그래머스
  • Java
  • coroutine
  • 코틀린
  • Retrofit
  • exception
  • Widget
  • Flutter
  • dfs
  • Kotlin
  • hilt
  • compose
  • 코딩테스트
  • Collection
  • 비동기처리
  • Imageview
  • Animation
  • HTTP
  • Android

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeungYong.Lee
Android Glance UI 갱신하는 방법 - PreferencesGlanceStateDefinition
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.