1. AppWidgetProviderInfo object를 xml로 작성한다.
– 레이아웃, 업데이트 주기, Provider, Configuration Activity
– res/xml/mywidget_provider.xml
<appwidget-provider xmlns:android=”http://schemas.android.com/apk/res/android”
android:minWidth=”146dp”
android:minHeight=”144dp”
android:initialLayout=”@layout/main”
android:updatePeriodMillis=”0” /> <!– 업데이트 주기(Service로 제어하기위해 0) –>
2. AppWidgetProvider를 상속받는 클래스를 만든다.
– Update, Enable, Disable, Delete 등 처리를 한다.
– AppWidgetProvider가 Broadcast를 상속받기 때문에 Broadcast 메시지를 수신한다.
– Widget의 브로드캐스트를 직접처리할려면 onReceive()를 등록한다. (안드로이드1.6 이상부터 30분 이상 단위로 Update 된다. 테스트 등의 목적으로 짧은 시간 단위로 갱신을 할 경우 Service를 상속받는 내부 업데이트 클래스를 만들어 처리한다.)
public class MyWidget extends AppWidgetProvider {
…
public void onReceive(Context context, Intent intent) {
…
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
Int[] appWidgetIds) {
…
}
}
3. AppWidgetProviderInfo에서 지정해준 Layout을 만든다.
– FrameLayout, LinearLayout, RelativeLayout과 AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar, TextView 만 사용이 가능하다.
<!–[if !supportEmptyParas]–> <!–[endif]–>
4. AndroidManifest에 Widget 정의
– receiver를 등록하고 intent filter에 android.appWidget.action.APPWIDGET_UPDATE를 정의한다.
– 정의된 AppWidgetProviderInfo를 mata-data에 기술해준다.
<receiver android:name=”.MyWidget” android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.appwidget.action.APPWIDGET_UPDATE” />
</intent-filter>
<meta-data android:name=”android.appwidget.provider”
android:resource=”@xml/mywidget_provider” />
</receiver>
5. Update시 RemoteViews와 AppWidgetManager를 이용하여 뷰 업데이트를 한다.
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
remoteViews.setTextViewText(R.id.textview01, ”update”);
<!–[if !supportEmptyParas]–> <!–[endif]–>
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
/* or onUpdate 밖에 메소드를 만들어서 사용할 경우
ComponentName thisWidget = new ComponentName(this, MyWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, remoteViews);
*/
6. 30분 이하의 간격으로 하면을 갱신하기 위해 Service 클래스를 상속받는 클래스 생성시 onStart()에서 처리
public static class UpdateService extends Service {
…
public void onStart(Intent intent, int startId) {
…// 위젯 업데이트
Context context = getBaseContext();
// 현재 시간 + 업데이트 간격으로 다음 업데이트 시간 지정
long nextAlarm = System.currentTimeMillis() + updateInterval
// onUpdate()로부터 전달받은 WidgetId를 다음 실행할 boradcast할 intent에
// 옮겨담고 Update action의 인텐트 생성
int appWidgetId = intent.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
Intent alarmIntent = new Intent(context, NaverRank.class);
alarmIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
alarmIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
// 위 속성을 가지는 브로드캐스트 메시지를 보내는 pendingIntent 객체 생성
PendingIntent pendingIntent =
PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
<!–[if !supportEmptyParas]–> <!–[endif]–>
// 위에 만들어진 pendingintent 객체와 다음 업데이트 시간으로 알람매니저 실행
AlarmManager alarmManager = (AlarmManager) context.getSystemService(android.app.Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, nextAlarm, pendingIntent);
}
}
좋은 정보 고맙습니다~^^
별말씀을요 ^_^