Skip to main content

[Android] Widget

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);

}

}

2 thoughts to “[Android] Widget”

댓글 남기기