티스토리 뷰

App Widgets

사용자가 새로운 앱 위젯을 추가할 때 세팅을 구성하게 하려면, 앱 위젯 구성 액티비티를 생성한다. 이 액티비티는 자동으로 앱 위젯 호스트에 의해 실행되고 사용자가 앱 위젯의 생성 시점에 가능한 세팅-앱 위젯 색상, 크기, 업데이트 기간 등-을 구성할 수 있도록 한다.

이 구성 액티비티는 보통 액티비티처럼 메니페이스 파일에 선언되어야 한다. 그러나 앱 위젯 호스트가 ACTION_APPWIDGET_CONFIGURE 액션으로 호출되기 때문에 이 인텐트를 받아들이도록 한다.

<activity android:name=".ExampleAppWidgetConfigure">
   
<intent-filter>
       
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
   
</intent-filter>
</activity>

또한 이 액티비티는 AppWidgetProviderInfo XML 파일의 android:configure 속성에 선언되어야 한다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
   
android:configure="com.example.android.ExampleAppWidgetConfigure"
    ...
>
</appwidget-provider>

※ 이 액티비티는 전체 이름으로 선언해야 한다. 왜냐하면 패키지 영역 밖에서 참조될 수 있기 때문이다.

실제 액티비티를 구현할 때 기억해야 할 중요한 것 2가지

  • 앱 위젯 호스트는 구성 액티비티를 호출하고, 구성 액티비티는 결과를 돌려줘야 한다. 결과는 앱 위젯 ID를 포함해야 한다.
  • 앱 위젯이 생성될 때 onUpdate() 메소드는 호출되지 않을 것이다. (시스템은 구성 액티비티가 실행될 때 ACTION_APPWIDGET_UPDATE 브로드캐스트를 보내지 않는다. ) 앱 위젯이 처음 생성될 때, 앱 위젯 매니저에게서 업데이트를 요청하는 것은 구성 액티비티의 책임이다. 그러나 첫번째만 건너띌 뿐 이어지는 업데이트에서는 onUpdate()가 호출된다.

Updating the App Widget from the configuration Activity

앱 위젯이 구성 액티비티를 사용할 때, 구성이 완료될 때 앱 위젯을 업데이트하는 것은 이 액티비티의 책임이다. AppWidgetManager로부터 직접 업데이트를 요청해서 구현할 수 있다.

요약 : 앱 위젯 업데이트와 구성 액티비티 닫기

  1. 액티비티를 실행한 인텐트에서 앱 위젯 얻기
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        mAppWidgetId = extras.getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID, 
                AppWidgetManager.INVALID_APPWIDGET_ID);
    }
    
  2. 앱 위젯 구성 실행하기
  3. 구성이 완료될 때, getInstance(Context)를 호출해서 AppWidgetManager 의 인스턴스 얻기
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    
  4. updateAppWidget(int, RemoteViews) 를 호출해서 RemoteView 레이아웃으로 앱 위젯 업데이트하기
    RemoteViews views = new RemoteViews(context.getPackageName(),
    R.layout.example_appwidget);
    appWidgetManager.updateAppWidget(mAppWidgetId, views);
    
  5. 반환 인텐트를 생성해서 액티비티의 결과를 세팅하고 액티비티 종료하기
    Intent resultValue = new Intent();
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
    setResult(RESULT_OK, resultValue);
    finish();
    

Tip : 구성 액티비티가 처음 시작할 때, 액티비티의 결과를 RESULT_CANCELED로 설정한다. 이 방법은 사용자가 마지막에 도달하기 전에 나갔을 때, 앱 위젯 호스트가 앱 위젯이 추가되지 않고 구성이 취소되었다는 것을 알게한다.

댓글