위젯은 안드로이드의 컴포넌트 중 하나로, 홈 화면과 잠금 화면에서 사용자가 간단한 UI 상호작용을 할 수 있게 해주는 요소입니다. 위젯은 AppWidgetProvider
클래스를 통해 관리되며, BroadcastReceiver
기반으로 작동하여 시스템 이벤트나 주기적 업데이트 등을 처리한다.
💡
BroadcastReceiver
란?
BroadcastReceiver는 핸드폰의 시스템 혹은 다른 앱에서의 이벤트를 수신해 앱에 전달해 주는 역할을 한다.
(ex : 베터리 부족)
onUpdate()
receiver
에 연결된 appwidget-provider
에 설정 값중 updatePeriodMillis
를 설정하면 일정시간 마다 정기적 업데이트가 가능onEnabled()
onDisabled()
:
onDeleted()
:
onReceive()
:
AppWidgetProvider
BroadcastReceiver
의 하위 클래스 이기 때문에 intent
로부터 외부의 데이터를 받아 상호작용한다.RemoteViews
AppWidgetManager
RemoteViews
에 담긴 위젯의 업데이트 정보를 시스템에 전달하는 역할을 한다.위젯 생성
app/src/main/package
에서 우클릭 → new 위젯 추가
AppWidgetProvider
상속 클래스appwidget-provider
위젯의 기본 속성 및 동작 지정 (위젯의 메타데이터)앱 사용중 업데이트 하기
private fun updateWidget(title: String?) {
// 위젯의 RemoteViews 생성
val remoteViews = RemoteViews(themedReactContext.packageName, R.layout.app_widget)
remoteViews.setTextViewText(R.id.appwidget_text, title)
// PendingIntent 생성: 위젯 클릭 시 해당 인텐트가 실행되도록 설정
// 사용자가 위젯을 클릭하면 앱이 열리도록 하는 인텐트 생성
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// 터치 이벤트 설정: 위젯 레이아웃의 특정 부분에 클릭 시 PendingIntent 실행
// widget_layout은 app_widget.xml의 가장 외부 layout view
remoteViews.setOnClickPendingIntent(R.id.widget_layout, pendingIntent)
// AppWidgetManager를 통해 위젯 업데이트
val appWidgetManager = AppWidgetManager.getInstance(themedReactContext)
val widgetComponent = ComponentName(themedReactContext, AppWidget::class.java)
val appWidgetIds = appWidgetManager.getAppWidgetIds(widgetComponent)
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews)
}
remoteView
와 AppWidgetManager
를 활용해 UI 업데이트를 해준다.Intent
에 담아 PendingIntent
로 보낸다