Home Screen을 사용하는 Widget을 만드는 방법을 정리해 보자
Widget을 만들려면 다음과 같은 3가지가 필요하다.
1. AppWidgetProviderInfo
  Widget의 metadata를 정의한다. AppWidgetProvider class, Widget layout 그리고 업데이트 주기등을 XML에 정의한다.
/res/xml 에 해당 xml로 정의하면 된다.

2. AppWidgetProvider
  실제 Widget Application.
업데이트 등 처리

3. View Layout 
  초기 layout을 정의하며, 이는 optional

또한 Widget을 설정하기 위한 Widget Configuraion을 정이할 수 있다. (반드시 있어야 하는 것은 아님)

본격적으로 Widget을 만들어 볼까? 간단하게 Home에 시간을 나타내는 Widget을 만들어 본다.
(나중에 안 사실이지만 Time같이 초단위로 화면이 업데이트 되어야 하는 것들은 Widget으로 만들면 안된다. 업데이트 주기의 minimum값이 있는 것 같다.더 확인해봐야 겠지만 거의 30분정도...^^ 또 삽질했다)
1. Mainfest에 Widget Application 선언   
<application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".TimeWidget" android:label="Timer Widget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/time_widget_provider" />
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="5" />
  TimerWidget이라는 Class를 만들로 providerInfo는 /xml/time_widget_provider.xml을 사용하기로 정의한다.
그리고 WidgetProvider는 receiver의 기능을 하기 때문에 activity가 아닌 receiver로 정의하고, 안드로이드 예제처럼 별도의 receiver를 만들지 않고 WidgetProvider에서 receiver의 onReceive() method를 override하여 구현한다.

2. AppWidgetProviderInfo Metadata 추가하기
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="146dp"
    android:initialLayout="@layout/main"
    android:updatePeriodMillis="1810000"
    android:minHeight="144dp"/>
초기 화면의 layout은 /layout/main.xml을 사용한다. 그리고 사이즈를 정의한다. 업데이트 주기는 30분 이상으로 설정한다.

3. Widget layout
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_height="146dp"
    android:layout_width="144dp"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/widget_timeview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:textColor="@android:color/black"
        android:textSize="12pt"
    />
</LinearLayout>

  Time을 화면에 그리기 위한 TextView를 정의한다.

4. AppWidgetProvider를 상속한 class 생성

public class TimeWidget extends AppWidgetProvider {

    java.text.DateFormat timeformat = SimpleDateFormat.getTimeInstance( SimpleDateFormat.MEDIUM, Locale.getDefault() );

 @Override
    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
    {
        updateTime( context, appWidgetManager);
    }
   
 @Override
    public void onReceive(Context context, Intent intent) {
        updateTime( context, AppWidgetManager.getInstance(context););
    }

    public void updateTime( Context context, AppWidgetManager appWidgetManager)
    {
        RemoteViews remoteViews1;
        ComponentName watchWidget;
       
        remoteViews1 = new RemoteViews( context.getPackageName(), R.layout.main );
        watchWidget = new ComponentName( context, WatchWidget.class );
        remoteViews1.setTextViewText( R.id.widget_timeview, timeformat.format( new Date()));
        appWidgetManager.updateAppWidget( watchWidget, remoteViews1 );
    }
   
}

 emulator에서 확인해 보니 실제 WIdget이 화면에 설정되면 onReceive() method가 호출되고 업데이트 주기가 되면 onUpdate() method가 호출됨을 확인하였다.

5. Widget 설정하기
  이렇게 만들어진 Widget을 어떻게 단말에 설정할까? emulator의 menu > add > widget을 선택하면 설정할 수 있는 widget list가 나온다 그리고 선택하면 된다.
근데 지울때는? 이거땜에 구글링을 했다.  Widget을 한 2초 정도 누르고 있으면 하단에 휴지통이 생긴다. 그럼 선택한 widget을 휴지통에 드래그하면 삭제된다.

주의) 삽질하고 알아낸 건데 업데이트 주기는 30분 이상으로 설정되어야 하는 것 같다.

Posted by 피의복수
BLOG main image
일에 필요한 자료 by 피의복수

카테고리

분류 전체보기 (40)
프로그램이야기 (38)
끄적끄적 (1)
취미 (0)
서비스이야기 (1)
빅데이터 (0)

최근에 올라온 글