반응형
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]
[WidgetHost]
Developer 의 정의를 보면, 다른 application 에 embedded 될 수 있는 application view 의 미니어쳐라고 기술해 놨네요.
정말 딱 들어맞는 말이네요.
이녀석은 이 Widget을 담고 있는 AppWidgetHost로부터 주기적으로 update 신호를 받습니다.
정말 딱 들어맞는 말이네요.
이녀석은 이 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처럼 불러주는 것입니다.
어떤 일을 해줄지를 구현해주는 것입니다.
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 작업을 하게 되죠.)
대신 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() 를 불러주는 것을 잊으면 안 되겠죠?
이 때, 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 에 등록해주어야 하죠?
그 과정이 빠져서는 안 됩니다.
자 이렇게만 봐서는 당연히 "확실하게는" 모르겠죠?
예제를 봐야 하는데.. 그건 다음 포스팅에서 살펴보겠습니다.
그럼~
2012/01/14 - [프로그래밍 놀이터/안드로이드] - [Tutorial] 예제를 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요 #2
손가락 추천 꾸욱~ 더 좋은 글로 보답하겠습니다.
4. Summary
- AppWidget을 만드는 것도 Activity 를 만드는 것처럼 쉽다.
- AppWidget은 다른 Application에 Embedde 될 수 있는 Application View 의 미니어처이다.
- 앱 위젯을 만들려면 다음과 같은 것들이 필요하다.
1. AppWidgetProvider class 를 상속하는 provider class.
2. Widget 의 View Layout 을 기술한 xml 파일
3. Widget 의 속성 ( Meta data )를 기술한 xml 파일 ( AppWidgetProviderInfo 와 매칭 )
4. 부가적인 것으로 Widget 의 Configuration 변경을 제공할 activity.
- AppWidgetProvider 는 AppWidgetHost 로부터 Broadcast Message를 받아 위젯의 생명주기 관리.
- Widget 의 View Layout xml 파일은 일반 Activity layout 과 같은 형태.
- Widget Meta Data 에는 minWidget / minHeight / updatePeriodMillis / initialLayout / configure 를 성정한다.
- Configuration Activity 가 있다면 연결해준다.
5. References
- http://developer.android.com/guide/topics/appwidgets/index.html
Android App Widget Dev Guide.
6. Tags
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] 쉽게 사용하는 Thread와 Handler. AsyncTask class 를 통해 해보아요~ (개념) (9) | 2012.01.19 |
---|---|
[Android/안드로이드] 예제를 통해 배우는 간단한 안드로이드 AppWidget. 함께 만들어 봐요 #2 (5) | 2012.01.14 |
[Java] String 을 + 로 연결하는 건 이제 그만! StringBuilder 로 간단하게 메모리와 퍼포먼스를 동시에 잡아보자. (2) | 2012.01.12 |
[Java] System Class 한번 제대로 써보자. 이제 당신도 JAVA 중급 개발자 (0) | 2012.01.12 |
[Java] Garbage Collection ( GC ) 가 뭔가요? GC 기초부터 고급까지! (7) | 2012.01.12 |
댓글