프로그래밍/안드로이드

안드로이드 - 앱위젯 appwidget 만들기 1탄

가카리 2013. 12. 27. 23:17
반응형

0. History


- 이 글은 2012-01-14 초안 작성 시작하였습니다.
- 잘못된 정보, 오래된 정보, 오타가 있다면 Comment 남겨 주세요. 확인 후 수정하겠습니다. 
- 이 글은 2012-01-16 초안 작성 완료하였습니다.




1. Prerequisite & References


- Java에 대한 기초
- Android 에 대한 기초

2012/01/14 - [프로그래밍 놀이터/안드로이드] - [Tutorial] 예제를 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요 #2


2. Intro


 

이 글을 왜 쓰시나요?


 이제는 왠만한 안드로이드 개발자분들이 Activity 는 쉽게 만들 것입니다.
하지만 안드로이드 AppWidget( 앱 위젯 )을 만드는 것은 엄청나게 고급기술처럼 여기고 어려워하시더라구요.
여러분들이 앱 위젯도 액티비티처럼 쉽게 만들 수 있도록 이 튜토리얼을 써봅니다. 




3. Information


 

앱 위젯이 뭔가요? 소개 좀 해주세요


 


 

<HTC Launcher>

 


 그림에서와 같이, 홈스크린 or 런처 ( HomeScreen or Launcher  ) 위에 떠 있으면서, User 와 Interaction 하는 녀석들을 말합니다. 

이 HomeScreen 을 Widget host 라 부릅니다.

[WidgetHost]

접기

Launcher 를 개발해 보신 분은 아시겠지만, General 한 Widget 을 붙이기 위해서는
Launcher 에서 AppWidgetHost 를 가지고 있어야 합니다.
런처에 붙는 AppWidget 의 View는 AppWidgetHostView 를 상속하게 됩니다.
사실 Launcher 에서 AppWidget을 주로 붙이기는 하지만, AppWidgetHost와 AppWidgetHostView를 잘만 활용, 구현하면
일반 앱에서도 당연히 위젯들을 관리할 수 있습니다. 

접기

  
Developer 의 정의를 보면, 다른 application 에 embedded 될 수 있는 application view 의 미니어쳐라고 기술해 놨네요.
정말 딱 들어맞는 말이네요.

이녀석은 이 Widget을 담고 있는 AppWidgetHost로부터 주기적으로 update 신호를 받습니다.

저런것. 우리도 쉽게 만들 수 있습니다. 



앱 위젯을 만들려면 무엇이 필요한가요?


1. AppWidgetProvider class 를 상속하는 provider class 
 
2. Widget 의 View Layout 를 기술한 xml 파일
 
3. Widget 의 속성 ( Meta data ) 을 기술한 xml 파일 ( AppWidgetProviderInfo 와 매칭 )
 
4. 부가적인 것으로 Widget 의 configuration 변경을 제공할 activity

 


자 위의 것들만 있으면 아주 기본적인 위젯을 만들 수 있습니다.
물론, Widget 에서 이것저것 일을 해주려면 추가적인 Class 나 Resource 가 필요 하겠지요.



준비물들을 보고서는 감이 잘 안 오는데 하나씩 설명 좀 해주세요.


AppWidgetProvider class 를 상속하는 provider class


AppWidgetProvider 는 BroadcastReceiver를 상속한 녀석으로,
AppWidgetHost ( 보통 런처입니다. ) 로부터 broadcast message 를 받습니다.
이녀석을 상속한 provider class 에서는 AppWidgetHost로부터 전달되어오는 Message 형태에 따라
어떤 일을 해줄지를 구현해주는 것입니다.

AppWidgetHost ( 런처 )는 widget이 update, enabled, disabled, delete 되었을 때 broadcast 를 쏴주고,
AppWidgetProvider가 이 메세지들을 받아서 이것을 implement 한 provider의 function들을 callback처럼 불러주는 것입니다.
 
자, 그럼 어떤것들이 implement 되어야 하는지 살펴봅시다!

onUpdate( Context context, AppwidgetManager appWidgetManager, int[] appWidgetIds )
 
onDeleted( Context, context, int[] appWidgetIds )
 
onEnabled( Context context )
 
onDisabled( Context context )
 
onReceived( Context context, Intent intent )

 



 감이 확실히 안 오실 것 같아, 간단한 Diagram을 준비해봤습니다.
 

 

 

 


자 이제 각 callback function 들이 어떤 일을 해줘야 하는지 봐볼까요?


onUpdate( Context, AppWidgetManager, int[] )


요 녀석은 App Widget 의 속성 ( Meta data ) 에서 지정해준
updatePeriodMillis 값에 따라 주기적으로 호출됩니다.
updatePeriodMillis 가 30분이라면, 30분마다 한번씩 이 onUpdate message가 들어옵니다.

또한 처음 widget 이 화면에 붙을 때, init() 작업을 해주기 위해서도 호출 됩니다.
( 단! Configuration activity 를 따로 두었다면, 처음 붙을 때 불리지 않습니다.
 대신 Configuration Activity 가 init 작업을 하게 되죠.)
 
요 녀석이 Key Function 이라고 할 수 있겠습니다.


onDelete( Context )


요 녀석은 App Widget 이 Widget host 로부터 삭제될 때 불립니다.


onEnabled( Context )


요 녀석은 App Widget 이 "처음" 생성될 때 불립니다.
여기서 "처음" 에 double quotation mark 를 붙인 이유는.. 확실한 의미전달을 위해서인데..
같은 위젯을 여러개 띄우면, 첫번째 위젯을 띄울 때만 호출됩니다.
즉, 첫번째 위젯을 붙일 때는 호출되지만, 동일한 위젯을 하나 더 추가해서 붙일 때는 호출되지 않습니다.


onDisabled( Context )


요 녀석은 App Widget 이 "삭제" 될 때 불립니다.
여기서도 "삭제" 에 double quotation mark 를 붙인 이유는.. onEnabled 와 비슷합니다.
즉 이녀석도 가장 마지막에 남아있는 App Widget 이 detach 되었을 때. 그 때만 호출되기 때문입니다.


onReceive( Context, Intent )


요 녀석은 일반적인 브로드캐스팅 receiver 입니다. 이녀석은 위에 나열한 callback 들보다 먼저 불리게 됩니다.
이녀석은 implement 할 "필요가 없습니다." 이미 다 구현이 되어 있기 때문이죠.
왜 이 녀석도 double quotation mark( 큰따옴표 ) 를 넣었을까요?
 
기본적으로 이 onReceive function은 AppWidgetProvider 에 구현이 되어있습니다.
뭐가 구현 되어있냐구요? Widget 이 붙었을 때 onUpdate()를 불러라, Widget 이 삭제되었을 때 onDelete()를 불러라.
뭐 이런내용이 미리 구현이 되어있죠. 하지만 "전문적인 개발자" 라면 이러한 단순한 callback 만 부르는
onReceive 의 내용이 맘에 들지 않을 수 잇죠. 그렇다면!! 추가적인 implement 를 해주시면 되겠습니다.
이 때, AppWidgetProvider의 기본적인 동작은 보장하고 싶다면 super.onReceive() 를 불러주는 것을 잊으면 안 되겠죠? 



Widget 의 View Layout 를 기술한 xml 파일


이녀석은 일반적인 activity 의 layout 과 차이점이 없습니다.
Activity의 Layout를 구성하듯 원하는 View 를 꾸며주시면 되겠습니다.



Widget 의 속성 ( Meta data ) 을 기술한 xml 파일


이녀석에는 App Widget 에 관련된 meta data( 부가 정보) 들을 기술해주면 됩니다. 
저장 위치는 /res/xml/ 
Tag 는 이렇게 시작합니다. <appwidget-provider>

여기에 지정해주는 attribute 들은 다음과 같습니다.
 
minWidth /  minHeight  / updatePeriodMillis  / initialLayout  /  configure  

attribute 이름만 봐도 뭐를 써줘야 하는지 다 아시겠죠?
감은 오지만 정확히 어떤 내용을 써줘야 하는지는 이제부터 설명 드리겠습니다.

minWidth 와 minHeight 는 AppWidgetHost 가 Widget의 크기 ( dimension ) 를 계산할 때 쓰입니다.
위젯이 런처에 붙을 때 런처가 정의한 cell size 라는 것이 있는데 이 단위에 맞게 위젯의 크기를 round up 시킵니다.
( developer 에 따르면 Orientation 등의 최악의 상황을 대비하여 72 * 72 를 min 으로 잡으라네요. ) -> one cell size
 
updatePeriodMillis 는 얼마나 자주 onUpdate() 가 불릴지를 결정하는 것이죠.
( developer 에 따르면 정확한 시간에 작동하지 않을 뿐더러, 배터리를 아끼기 위해서 가능한 길게 설정하길 권장합니다.
 추가적으로 User 가 update 주기를 설정할 수 있도록 하는 것이 가장 좋은 방법이라고 제시하고 있습죠. )

configure 에는 앞서 말했던 부가적인, configurationActivity 가 있을 경우에 link 해주시면 되겠습니다. 



부가적인 것 : Widget 의 configuration 변경을 제공할 activity


요놈은 일반 Activity 와 같습니다.
단지, 속성 ( Meta data ) 을 통해 링크시키며, widget 이 처음 붙을 때 start 된다는 것만 빼면요.



추가적인 것 : Manifest 등록


앞서 AppWidgetProvider 는 Broadcast 를 상속한 녀석이라고 했죠?
Broadcasting 을 받으려면 어떻게 해야 하죠? 당연히 Receiver 를 Manifest 에 등록해주어야 하죠?
그 과정이 빠져서는 안 됩니다.



자 이렇게만 봐서는 당연히 "확실하게는" 모르겠죠?

예제를 봐야 하는데.. 그건 다음 포스팅에서 살펴보겠습니다.

그럼~ 

 

출처 :  http://aroundck.tistory.com/entry/Tutorial-간단한-안드로이드-AppWidget-어떻게-만들까요-함께-만들어-봐요