티스토리 뷰

AppWidgetProvider 클래스는 BroadcastReceiver 를 상속받아서 앱 위젯 브로드캐스트를 처리할수 있는 편리한 클래스이다.

  • onUpdate()

    AppWidgetProviderInfo 에서 updatePeriodMillis 속성에 정의한 간격대로 앱 위젯을 업데이트하기도록 호출한다. 이 메소드는 사용자가 앱 위젯을 추가할 때 호출되서, 필수적인 셋업이 호출된다. 그러나 만약 구성 액티비티가 선언된다면, 사용자가 앱 위젯을 추가할 때 이 메소드를 호출되지 않고 다음의 업데이트에서 호출된다. 구성을 마칠 때 첫번째 업데이트가 실행되는것은 구성 액티비티의 책임이다.
  • onDeleted(Context, int[])

    앱 위젯은 호스트에서 삭제될때마다 호출된다.
  • onEnabled(Context)

    인스턴스 앱 위젯이 첫번째 생성될 때 호출된다.
    예를 들어, 사용자가 두개의 앱 위젯 인스턴스를 추가한다면, 이것은 오직 한 번만 호출된다. 만약 새로운 데이타베이스를 열거나 다른 설정을 실행할 필요가 있다면, 모든 앱 위젯 인스턴스를 위해 발생하도록 할 필요가 있을 때 적절한 위치이다.
  • onDisabled(Context)

    이것은 앱 위젯의 마지막 인스턴스가 호스트에서 삭제될 때 호출된다. 여기서 onEnabled(Context)에서 했던 임시 데이타베이스 같은 것들을 정리한다.
  • onReceive(Context, Intent)

    이것은 모든 브로드캐스트에 대해 앞에서 나온 콜백 메소드 전에 호출된다. 보통 이 메소드를 구현할 필요는 없다. 왜냐하면 기본적인 AppWidgetProvider 구현은 모든 앱 위젯 브로드캐스트를 필터하고 위에 있는 메소드에서 적당한 것을 호출한다.

onUpdate()

onUpdate() 은 각각의 앱 위젯인 호스트에 추가될 때 호출되기 때문에 AppWidgetProvider 의 가장 중요한 콜백 메소드이다. 앱 위젯이 어떤 사용자의 상호작용 이벤트를 받았다면, 이 콜백안에서 이벤트 핸들러에 등록해야 한다. 앱 위젯인 임사 파일이나 데이타 베이스를 생성하지 않았거나, 다른 정리작업을 행한다면, onUpdate() 를 사용한다. 예를 들어 앱 위젯에 있는 버튼을 클릭할 때 액티비티를 실행하길 원한다면, AppWidgetProvider의 아래 구현을 사용한다.

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

소스 분석

  • 액티비티를 실행하는 PendingIntent 정의
  • 버튼에 setOnClickPendingIntent(int, PendingIntent) 를 단다

루프를 사용하여 앱 위젯의 모든 인스턴스(appWidgetIds) 에 적용한다.

댓글