Widget 이란?
홈 화면 등에 삽입되어 업데이트 되며, 사용자의 편의를 위해 제공되는 기능
BroadcastReceiver 란?
시스템 또는 애플리케이션에서 발생한 브로드캐스트 메세지를 수신하고 처리하는 컴포넌트이며, Android 시스템 내에서 또는 앱 간에 발생하는 이벤트를 다른 컴포넌트가 수신할 수 있도록 해주는 일종의 메시지이다.
주로, 배터리 상태, 네트워크 연결 성태, 문자 메시지 수신, 위젯 등과 같은 중요한 시스템 이벤트를 모니터링한다.
앱간 통신을 위해 사용할 수 있으며, 한 앱에서 특정 브로드캐스트 메시지를 보내고 다른 앱이 이를 수신하여 동작을 처리할 수 있다.
위젯을 구성하는 주요 컴포넌트
| 컴포넌트 | 설명 |
| AppWidgetProvider | 위젯에 대한 시스템 이벤트를 처리 예를 들어 위젯이 업데이트될 때, 크기가 변경될 때 또는 삭제될 때 이를 감지하여 적절한 작업을 수행 |
| RemoteViews | 위젯의 UI를 정의 위젯은 RemoteViews를 통해 업데이트되고, 이는 앱 프로세스 외부에서 UI 업데이트가 수행되므로 제한된 UI 요소만 사용할 수 있음 예를 들어 버튼, 텍스트 뷰, 이미지 뷰와 같은 정적 UI 요소 사용 |
| AppWidgetProviderInfo | 해당 XML 파일은 위젯의 크기, 업데이트 주기 및 기타 속성을 정의하는 메타데이터 |
Android Studio 에서 설정하는 법
1. 기본 위젯 설정
res/xml/ 폴더 아래에 위젯의 기본 속성을 설정하는 appwidget_provider_info.xml 파일을 생성
해당 파일은 위젯의 크기, 업데이트 주기, 기본 레이아웃 등을 정의한다.
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="100dp"
android:updatePeriodMillis="86400000" <!-- 업데이트 주기, 1일(86400초) -->
android:initialLayout="@layout/widget_layout" <!-- 위젯 레이아웃 -->
android:previewImage="@drawable/preview" <!-- 위젯 생성 전 미리보는 이미지, 없을 경우 앱 아이콘 -->
android:configure="com.example.android.ExampleAppWidgetConfigure" <!-- 위젯을 추가할 때 속성을 구성하기 위한 Activity 정의[배경색, 업데이트 주기, 표시할 내용 등] (선택) -->
android:resizeMode="horizontal|vertical" <!-- 사용자가 홈 화면 위젯의 크기를 조절 할 수 있는 방향 정의, 모두 조절 가능 할 경우 horizontal|vertical -->
android:widgetCategory="home_screen" <!-- 위젯이 표시될 수 있는 위치 정의, 홈, 잠금 둘다 가능할 경우 home_screen | keyguard -->
/>
2. 위젯 레이아웃 생성
res/layout/ 폴더 아래에 위젯의 레이아웃 파일을 정의
위젯은 간단한 UI 요소로 보여줘야 하므로, 복잡한 동적 UI 보다는 정적인 구성 요소를 주로 사용한다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/widget_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello Widget!"
android:textSize="16sp" />
<Button
android:id="@+id/widget_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update" />
</LinearLayout>
3. AppWidgetProvider 구현
AppwidgetProvider 클래스를 상속하여 위젯의 동작을 제어
해당 클래스는 위젯의 업데이트, 클릭 이벤트 처리등을 담당한다.
class MyAppWidgetProvider : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
companion object {
private fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val views = RemoteViews(context.packageName, R.layout.widget_layout)
// 버튼 클릭 시 동작 설정
val intent = Intent(context, MyAppWidgetProvider::class.java).apply {
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
}
val pendingIntent = PendingIntent.getBroadcast(
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
views.setOnClickPendingIntent(R.id.widget_button, pendingIntent)
// 위젯 업데이트
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
}
4. Manifest 파일 수정
AndroidManifest.xml에 위젯에 대한 정보를 추가해야 함
AppWidgetProvider를 등록하고 meta-data로 위젯 설정 파일을 지정
<receiver android:name=".MyAppWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_provider_info" />
</receiver>
참고자료
[Android] 위젯 만들기 #1
안드로이드에서 위젯 만들기
velog.io
'Android' 카테고리의 다른 글
| 멀티모듈 알아보기 (1) - 멀티 모듈이란? (2) | 2024.12.03 |
|---|---|
| 안드로이드 권장 아키텍처 (1) | 2024.09.23 |
| Hilt (의존성 주입) (1) (2) | 2024.09.18 |
| Wear Os (워치) (4) | 2024.09.17 |
| PCM (펄스 코드 변조) (5) | 2024.09.09 |