2014년 3월 9일 일요일

[ANDROID CODE / 안드로이드] HOME SCREEN WIDGET (홈스크린 위젯 작성)

안드로이드 PHONE은 i PHONE과 다르게 위젯을 제공합니다.

i PHONE 바탕화면에 어플에 대한 아이콘이 존재하는데

ANDROID PHONE은 바탕화면(HOME SCREEN)이라는 개념과 함께

간단한 동작은 바로 시킬 수 있는 Widget(위젯)을 가지고 있습니다.

이것이 아마도 i PHONE과 ANDROID PHONE과의 큰 차이 점일 것입니다.

Widget을 만들기 시작해 볼까요~~~~!!

우리가 흔히 Phone에서 Widget을 추가 할때는 Phone의 Home화면을 길게 터치

후에 '위젯'이라는 탭을 선택한 후 나오는 위젯을 보고 결정하게 됩니다.

이때 자세히 보게 되면 1x1 / 2x1 / 4x4 이런 숫자를 보시게 될껍니다. 이게 뭐냐

바로 Widget의 크기가 되겠습니다. 위젯의 크기는 셀(cell)이라고 하는데

이는 phone의 바탕화면을 일정 비율로 자른 영역이라고 생각하시면 됩니다.


쉽게 이야기 해서


위 화면을 보시면 3개 3개로 나누어져 있는데 이게 cell 즉 Widget이 차지하는 영역입니다.

그림에는 3x3 이지만 이건 이해를 돕기 위한 것이구요.. 원래는 4x4가 기본이며 현제는 

5x5도 있습니다. 이건 해상도에 따라서 바뀝니다. 가장 쉽게 내 divice의 cell을 알고 싶다면 

위젯을 롱클릭하시면 바탕화면서 cell의 범위가 나옵니다. 위의 화면 처럼요~~

Widget 의 가이드 라인은 

http://developer.android.com/guide/practices/ui_guidelines/widget_design.html

설명되 있습니다. 참고 하세요~

이제 Widget을 만들어 보겠습니다.

우선 만들기 전에 다음을 참고 하시면 도움이 되실껍니다. Widget은 그 크기나 기능에 한계

를 가지고 있습니다. 마음대로 막 만들 수 없다는 거죠.

- Layout -

   FrameLayout

   RelativeLayout

   LinearLayout

이렇게 3가지의 Layout을 지원하며

- View -

   AnalogClock

   Button

   Chronometer

   ImageButton

   ImageView

   ProgressBar

   TextView

이렇게 7개의 View를 지원합니다.


우선 AppWidget Provider를 작성해야 됩니다.

Eclipese를 사용하신다면 project에서 res폴더에 xml 폴더를 추가 하신 후(이건 솔찍하게

만들어야 되는지 아니면 자동으로 만들어 지는 모르겠습니다. 전 추가 했습니다.)

android xml 추가 하시면 xml 종류에 AppWidget Provider가 있습니다. 이걸 추가 해 주세요.

추가 해주시고 나면 만들고자 하는 Widget의 속성을 지정하게 됩니다.

속성의 내용은

  Min width = 위젯의 최소 너비

  Min height = 위젯의 최소 높이

  Update period millis = 위젯의 업데이트 주기

  Initial layout = 위젯의 초기 레이아웃

  Configure = 위젯 환경설정 액티비티 지정


위젯의 최소 너비와 최소 높이는 가이드라인을 보시면 설명되어 있습니다.

이제 Provider를 추가 했으면 Manifest에 Receiver를 추가 해 주셔야 합니다.

Widget은 (여기서는 Home Screen Widget) AppWidgetProvider 를 상속 -> 

AppWidgetProvider는 Broadcast Receiver를 상속 받기 때문에 Receiver를 등록해 주는

겁니다.

1. Intent Filter를 추가 합니다.

2. android.appwidget.action.APPWIDGET_UPDATE를 추가 합니다.

3. Meta data를 추가 합니다.

4. Meta data를 추가 후
    
    Name = android.appwidget.provider

    Resource = @xml/provider의 이름

이렇게 추가 해주시면 됩니다.

이제 class추가 해주시면 됩니다.

Widget의 실제 class라고 생각 하시면 됩니다. class를 추가 해 주신 후 

Superclass에 android.appWidget.AppWidgetProvider를 입력 하시면 됩니다.

class 파일을 만드시면 다음과 같이 4가지의 메서를 정의하게 됩니다.

1. onUpdate() : ACTION_APPWIDGET_UPDATE ACTION를 가지는 Broadcast Message 

                       수신시 호출

2. onEnabled() : ACTION_APPWIDGET_ENABLED ACTION를 가지는 Broadcast Message

                        수신시 호출

3. onDeleted() : ACTION_APPWIDGET_DELETED ACTION를 가지는 Broadcast Message

                       수신시 호출

4. onDisabled() : ACTION_APPWIDGET_DISABLED ACTION를 가지는 Broadcast Message

                         수신시 호출



여기서 update를 담당하는 onUpdate()를 구현하면

================================ 기본 Source =====================================

@Override

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]

                                                                                                    appWidgetIds){

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout);
    appWidgetManager.updateAppWidget(appWidgetId, views);

}

=================================================================================

그리고 AppWidgetProvider는 Broadcast Receiver 상속 받는 class 이기 때문에 

onReceive() 구현해야 합니다.

간단히 onReceive Source를 보게 되면


================================= 기본 source ====================================
public void onReceive(Context context, Intent intent){

      String action = intent.action();

      if(AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action){

         Bundle extras = intent.getExtras();
       
         if(extras != null){

             int[] appwidgetIds = extras.getIntArray(AppWidgetManager.

                                                                                     EXTRA_APPWIDGET_IDS);

             if(appWidgetIds != null && appWidgetIds.length > 0){
               
                this.onUpdate(context, AppWidgetManager.getInstance(context),

                                                                                                    appWidgetIds);
               
                }
             }
         }else if(AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)){

             Bundle extras = intent.getExtras();

             if(extras != null && extras.containsKey(AppWidgetManager.
                
                                                                                    EXTRA_APPWIDGET_ID)){


                    final int appWidgetId = extras.getInt(AppWidgetManager.

                                                                                  EXTRA_APPWIDGET_ID);

                   this.onDeleted(context, new int[] {appWidgetId};

                 }

         } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action){

            this.onEnabled(context);

         } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equalse(action){

            this.onDisabled(context);

         }

}
=================================================================================


Source의 구성은 끝났습니다. 실행해 보면 Widget이 뜨는 것을 확인 할 수 있을것입니다.

댓글 없음:

댓글 쓰기