티스토리 뷰

 


지난 시간에 이어서 오늘은 기본적인 실습을 해보도록 하겠습니다.

먼저,,,전체적으로 해줘야 할 일을 정리해보겠습니다. 안드로이드에서 AppWidget을 사용하기 위해서는 다음과 같은 일련의 개발이 필요합니다.

1. manifest 수정
2. appWidgetProviderInfo Metadata 작성
3. Provider의 onUpdate 함수를 재정의한다.
4. 위젯과 버튼클릭시 호출할 엑티비티의 Layout을 설정합니다.
5. 엑티비티에서 위젯 매니저를 호출합니다.

상세하게 코드로 봅시다. (가장 하단에 안드로이드 프로젝트를 올려놓았습니다. 이클립스에서 열어서 확인해보시면 더 쉽게 보실수 있습니다.)

1. 먼저 manifest를 수정합니다. manifest.xml 안에 아래의 구문을 추가합니다.

이때, reciver는 이벤트를 받을 Provider라고 생각하시면 됩니다. 예제에서는 ExampleAppWidgetProvider class 를 리시버로 정해놨네요.

다음으로 반듯이! <intent-filter> 안에 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 를 선언해줘야!!! 안드로이드OS가 본 프로그램을 위젯으로 인식합니다.

<receiver android:name=".ExampleAppWidgetProvider" >
   
<intent-filter>
       
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   
</intent-filter>
   
<meta-data android:name="android.appwidget.provider"
               
android:resource="@xml/widget_info" />
</receiver>

 또한 버튼 클릭시에 띄울 엑티비티를 위해 <intent-filter> 안에 <action ~ > 부분도 manifest.xml안에 수정합니다.

   <activity android:name="ExampleActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.APPWIDGET_CONFIGURE" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2. appWidgetProviderInfo Metadata 작성

위젯 프로바이더는 반듯이 메타데이터 파일을 가지고 있어야 합니다. 메타데이터는 xml 파일이며,
프로젝트 내에서의 위치는 res/xml/ 아래에 생성을 직접 하셔야 합니다.

xml 파일의 내용은 기본적으로 다음과 같습니다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/example_appwidget" 
    android:configure="com.ko.widget.ExampleActivity"
    >
</appwidget-provider>

3. Provider의 onUpdate함수를 재정의합니다.

본 예제에서는 버튼 클릭시에 아무것도 없는 빈 엑티비티를 띄우도록 하겠습니다. 다음과 같이 Provider 함수의 onUpdate함수를 작성합니다.

또한, 버튼을 눌러서 엑티비티와 위젯과 소통하기 위해 추가로 static void updateWidget 함수를 생성해 줍니다.

public class ExampleAppWidgetProvider extends AppWidgetProvider {

   
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
       
final int N = appWidgetIds.length;

       
// Perform this loop procedure for each App Widget that belongs to this provider
       
for (int i=0; i<N; i++) {
           
int appWidgetId = appWidgetIds[i];

           
// Create an Intent to launch ExampleActivity
           
Intent intent = new Intent(context, ExampleActivity.class);
           
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

           
// Get the layout for the App Widget and attach an on-click listener
           
// to the button
           
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views
.setOnClickPendingIntent(R.id.button, pendingIntent);

           
// Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager
.updateAppWidget(appWidgetId, views);
       
}
   
}
   
    static void updateWidget(Context context,  AppWidgetManager appWidgetManager,  int appWidgetId){
     //나중에 사용하겠습니다. 일단 비워두시고..
    }
}

OnUpdate() 함수에 대한 자세한 설명은 아래의 포스트를 읽어주세요.
http://fallingstar.tistory.com/91 

4. 위젯 및 엑티비티 레이아웃 설정

위젯 레이아웃은 res/layout/ 안에 xml 파일로 존재해야하며, 다음과 같이 만듭니다.

( 2번 과정 메타데이터 생성시 example_appwidget 를 초기 레이아웃 파일로 하였으므로, res/layout/ 아래에 example_appwidget.xml 파일을 만드시기 바랍니다.)

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <Button
     android:text="Click"
     android:id="@+id/button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="center"
     android:layout_gravity="right">
    </Button>
</LinearLayout>

엑티비티 레이아웃도 마찬가지로 res/layout/ 안에 존재하며, 다음과 같이 만듭니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
    <Button
     android:text="Click"
     android:id="@+id/button_activity"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="center"
     android:layout_gravity="right">
    </Button>
   
</LinearLayout>

5. 엑티비티에서 위젯 매니저를 호출합니다.

OnCreate 부분을 다음과 같이 수정합니다. (버튼에 리스너를 달고, 버튼 클릭시 위젯매니저를 호출하도록 합니다.)

int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // Find the widget id from the intent. 
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            mAppWidgetId = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        } 

        Button btn = (Button)findViewById(R.id.button_activity);
        btn.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    final Context context = ExampleActivity.this;      
    AppWidgetManager widgetMgr = AppWidgetManager.getInstance(context);

    //widget Provider에서 사용자가 정의한 함수를 호출하여 값을 넘겨준다.
    ExampleAppWidgetProvider.updateWidget(context,widgetMgr,mAppWidgetId);
    // Make sure we pass back the original appWidgetId
             Intent resultValue = new Intent();
             resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
             setResult(RESULT_OK, resultValue);
             finish();
   }
  });
}

이렇게 해서 실행해 보시면 결과 아실수 있을 겁니다.
일단은 코드 정리도 안되고 하니 제가 직접 작성한 안드로이드 프로젝트 파일을 압축하여 올려놓겠습니다.


보시고 천천히 따라해보세요.

다음 포스트에서는 위젯을 이용해서 위젯의 색상을 바꾸는 것을 해보도록 하겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함