본문 바로가기
Android

Widget (위젯)

by Jiwon_Loopy 2024. 9. 19.
반응형

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

 

728x90
반응형

'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