본문 바로가기

Android

[ AppWidgetProvider / Receiver/Service] 위젯만들기

반응형

첨부파일 :

위젯 만드는 방법이 적힌 문서.

추가해서 설명하면

1. 맘에드는 이름으로 프로젝트 생성
2. AndroidManiFest.xml을 수정한다.
   - 기본적으로 있는 activity를 삭제하고 대신 receiver를 넣는다.
   - 리시버와 연결할 클래스를 하나 만들어준다.
     (왼쪽 Attributes 쪽에 언드바로 Name* 이렇게 되있는거 클릭해서 클래스를 만들어준다.
      반듯이 AppWidgetProvider를 상속받아서 만든다)
   - receiver에 intent-filter를 추가하고 , action 으로
     android.appwidget.action.APPWIDGET_UPDATE 추가한다.
   - receiver에 meta-data로 "android.appwidget.provider" 추가하고
     resource로 "@xml/widget_word" 추가
    
     아래와 같이 추가하면 된다. 단,  widget_word.xml 파일을 xml 폴더에 생성해야 한다.
     <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_word" />


    xml이 아래와 같이 작성되면된다.
    예)
<receiver android:name="CyWidget">
<intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_word" />
</receiver>


3. 생성한 widget_word.xml를 프로젝트의 res/xml 안에다 추가해주고 가로 세로 높이,
   update period등을 설정해 준다. 마지막으로 실행시킬 layout만 선택해주면 끝이다.

xml/widget_word의 내용은 아래와 같이 하면 된다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="150dip"
android:updatePeriodMillis="86400000"
android:minHeight="60dip"
android:initialLayout="@layout/main">
</appwidget-provider>

4. 확인 방법은 안드로이드 바탕화면을 왼쪽키로 길게 누르면 팝업 메뉴가 뜨는데
   그중에 widget을 선택하면 위에서 만든 위젯이 추가된걸 볼수 있다.
   그거 클릭해서 바탕화면 아무데나 놓고 쓰면 된다.


P.S 위젯은 activity하고 틀려서 클릭 이벤트 등록하고 처리하는 식으로 할 수가 없다.
    때문에 setOnClickPendingIntent() 함수를 이용해서 이벤트를 처리 해야 한다.
    함수를 보면 눈치 챌수 있듯이 intent를 등록해서 클릭됬을때 실행되도록 하는 방식이다.

참고할 수 있도록 아래에 예를 적어둔다.


// AppWidgetProvider를 상속 받아야 함
public class CyWidget extends AppWidgetProvider {
        
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        
        public static String ACTION_WIDGET_TEST = "test";
        

           // CyWidget 은 클레스 현제 클래스 이름임..
        static final ComponentName THIS_APPWIDGET = new ComponentName("test.test1", "test.test1.CyWidget");

        @Override
        public void onReceive(Context context, Intent intent) {

                final String action = intent.getAction();
                
                if(action.equals(ACTION_WIDGET_TEST))
                {
                      // 처리 루틴을 넣을자리
                }
                else
                    super.onReceive(context, intent);
                                
        }

        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                        int[] appWidgetIds) {

        
                this.appWidgetManager = appWidgetManager;

                     //이벤트 등록을 위해 RomoteView를 만든다.
                     // 위젯 화면의 레이아웃을 인자로 넣는다.
                remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
                
                // main 레이아웃에 들어있는 id가 ibSetting인 녀석이 클릭되면
                     // SettingActivity가 실행된다.
                Intent settingIntent = new Intent(context, SettingActivity.class);
                PendingIntent settingPendingIntent = PendingIntent.getActivity(context, 0, settingIntent, 0);
                remoteViews.setOnClickPendingIntent(R.id.ibSetting, settingPendingIntent);
                
                // main 레이아웃에 들어있는 id가 ibTest인 녀석이 클릭되면
                     // ACTION_WIDGET_TEST 액션이 현재 클래스(CyWidget) 으로 전달된다.
                     // 전달된 액션은 OnReceive()에서 받을 수 있다.
                Intent testIntent = new Intent(context, CyWidget.class);
                testIntent.setAction(ACTION_WIDGET_TEST);
                PendingIntent testPendingIntent = PendingIntent.getBroadcast(context, 0, test, 0);
                remoteViews.setOnClickPendingIntent(R.id.ibTest, testPendingIntent);
                
                // 업데이트 꼭 해줘야 동작됨
                     appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
        }

        
}



- 마지막으로 버튼 눌린 이미지 처리하기!

   drawable folder 안에 다음과 같이 xml 파일을 만들고 버튼으로 처리할 컨트롤의 background를
   만든 xml 파일로 설정한다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false"
        android:drawable="@drawable/icon_album" />
    <item android:state_pressed="true"
        android:drawable="@drawable/press_icon_album" />
    <item android:state_focused="true"
        android:drawable="@drawable/icon_album" />
    <item
         android:drawable="@drawable/icon_album" />
</selector>
  

   이렇게 해야 버튼 눌리는거 표현 할 수 있다.



참고 :
- 텍스트 글자 바꿀때는 RemoteView의 setTextViewText() 사용하여야 한다.
- 위젯의 화면을 갱신하기 위해서는 반듯이
   AppWidgetManager의 updateAppWidget()을 호출 해줘야 한다.

반응형

'Android' 카테고리의 다른 글

[Thead]자동저장 스레드  (0) 2011.01.24
[Camera] 카메라  (0) 2011.01.24
[etc]이클립스 - 디컴파일러  (0) 2011.01.24
[Media/Widget만들기/ Service/ Receiver] 단순 media player  (1) 2011.01.24
안드로이드 개발환경 셋팅  (0) 2011.01.24