안드로이드 위젯 개발은 생각만큼 개발하기 쉬운 것은 아닙니다.

감히 안드로이드 개발을 하면서 가장 지저분한(?) 아이템 중 하나라 감히 말씀드리고 싶네요.

언뜻 보기에는 그렇게 대단해 보이지 않는 녀석같지만, 기능을 하나하나 추가하다 보면, 의외로 난관에 부딪히는 경우가 많습니다.

 

일단, 그런 예외적인 상황들에 앞서, 개발자 사이트에서 제공해 주는 문서를 한 번 읽어보겠습니다.

https://developer.android.com/guide/topics/appwidgets?hl=ko

 

앱 위젯 빌드  |  Android 개발자  |  Android Developers

앱 위젯은 다른 애플리케이션(예: 홈 화면)에 삽입되어 주기적인 업데이트를 받을 수 있는 소형 애플리케이션 뷰입니다. 이러한 뷰는 사용자 인터페이스에서 위젯이라고 하며 앱 위젯 공급자를 사용하여 게시할 수 있습니다.

developer.android.com

문서에서는 AppWidgetProviderInfo, AppWidgetProvider, 그리고, 초기 레이아웃 세 가지가 필요하다고 기술되어 있습니다.
이 중에서 가장 먼저 선행되어야하는 것은 WidgetInfo xml 파일과 APPWIDGET_UPDATE action 을 받을 수 있는 BroadcastReceiver 입니다.

 

1. AppWidetProviderInfo(Widget Info) 는 res/xml 디렉토리에 추가해주어야 하는 xml 파일입니다.

개발자 사이트 문서에는 더 많은 속성 값들과 설명들이 나열되어 있습니다. 이 중 가장 중요한 값은 아래에 기술된 minWidth, minHeight 값입니다. 이 두 개의 속성 값이 없을 경우, 위젯 추가 화면에 표시되지 않습니다.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:minWidth="40dp"
	android:minHeight="40dp">
</appwidget-provider>

 

2. 그리고, BroadcastReceiver 파일을 추가한 뒤, AndroidManifest.xml 파일에 정보를 추가해 줍니다.
여기까지 진행 하면 그림과 같이 기본 아이콘으로 설정된 1x1 위젯이 위젯 추가 화면에서 메뉴가 나오기 시작합니다.

class WidgetProvider : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
    }
}

 

 

<receiver android:name=".WidgetProvider" >
	<intent-filter>
	<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
	</intent-filter>
	<meta-data 
    	android:name="android.appwidget.provider"
    	android:resource="@xml/widget_info"/>
</receiver>
    

 

 

물론, 여기까지 추가할 경우, 실제 위젯을 홈 화면에 띄울 수 있는 것은 아닙니다.
코드만 놓고 보아도 표시할 기본 레이아웃이 지정되어 있지 않기 때문에, 위젯 추가 화면에 표시만 될 뿐, 추가할 수 있는 위젯은 없는 셈입니다.

개발자 문서와는 약간 다르게 구현한 이유는, 안드로이드라는 시스템이 위젯을 인식하기 위해서는 최소한 어떠한 값들이 있어야 하는가를 조금이나마 가늠해보기 위한 것입니다.
핵심은 AndroidManifest.xml 에 기술된 <receiver> 와 <meta-data> 태그 안의 resource 파일입니다.
또 이 resource 파일에서 가장 중요한 값은 minWidth 와 minHeight 라는 것입니다.

 

3. 마지막으로 BroadcastReceiver - onReceive() 에 AppWidgetManager 코드를 추가해 주시면, 홈스크린에 추가되는 위젯을 만들 수 있습니다.

class WidgetProvider : BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) {
		if(intent == null){
			return
		}

		val widgetManager = AppWidgetManager.getInstance(context)
		when (intent.action) {
			AppWidgetManager.ACTION_APPWIDGET_UPDATE -> {
				val remoteViews = RemoteViews(
					"com.tistory.develop_branch.widget",
					R.layout.widget_layout
				)
				intent.extras?.let {
					val appWidgetIds: IntArray? =
						intent.extras!!.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS)
					appWidgetIds?.forEach {
						widgetManager.updateAppWidget(it,remoteViews)
					}
				}
			}
		}
	}
}

 

여기까지 진행된 소스는 여기를 참고하세요.

 

2020/03/10 - [Android/Widget] - 안드로이드 위젯 개발하기 (2)

 

'Android Widget' 카테고리의 다른 글

안드로이드 위젯 개발하기 (4)  (0) 2020.07.27
안드로이드 위젯 개발하기 (3)  (0) 2020.03.13
안드로이드 위젯 개발하기 (2)  (0) 2020.03.10