본문 바로가기

Android

AppWidgets


/*

  • 안드로이드 Home과 같은 타 app.에 embedded 할 수 있는 mini app. View라고 할 수 있다.  이러한 view를 widget이라 부르고 'AppWidget provider'를 통해 publish 할 수 있다.  이렇게 widget을 포함할 수 있는 app. Component를 'AppWidget host'라 부른다.
  • 단순히 mini app.을 embedded 해서 선택된 기능을 제공할 수 있도록 하는 것 뿐 아니라 주기적인 업데이트를 통해 사용자에게 적절한 정보를 제공하는 것도 포함하는것으로 보인다.
appwidget.png

The Basics - App Widget을 생성하기 위해 할일..
  • AppWidgetProviderInfo object
    • layout, update frequency와 AppWidgetProvider class등 meta data를 XML 형식으로 기술
  • AppWidgetProvider class implementation
    • App Widget이 updated, enabled, disabled 또는 deleted 되었다는 broadcast 메시지를 수신한다.  즉 App Widget과 정의된 기본 methods 를 통해 interface가 연결되어 있다고 할 수 있다.
  • View layout
    • XML 형식으로 App Widget의 initial layout을 정의한다.
  • Additionally
    • 사용자가 App Widget의 setting을 설정하고자 할 경우 개발자는 App Widget configuration Activity를 통해 제공할 수 있다.

AppWidgetProviders
  • 어떤 app.이라도 widget을 publish 할 수 있다.  단 AppWidgetManager.ACTION_APPWIDGET_UPDATE intent를 받는 BroadcastReceiver를 가지고 있어야 한다.  그래서 안드로이드는 BroadcastReceiver를 extend한 AppWidgetProvider 클래스를 제공한다.
  • 안드로이드 팀에서 widget이라는 개념을 도입하고자 했고 가장 적절한 방법을 찾던 중 BroadcastReceiver와 연관지었다는 것은 자연스러운 일이었을 것이다.  만약 AppWidgetProvider 클래스를 제공하지 않았더라도 widget을 개발하고자 하는 개발자라면 당연히 BroadcastReceiver를 이용했을 것이다.
  • AndroidManifest에서 widget 정의
  •           <receiver android:name="TestAppWidgetProvider"
                          android:label="@string/oh_hai"
                          android:icon="@drawable/oh_hai_icon"
                          >
                  <intent-filter>
                      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                  </intent-filter>
                  <meta-data android:name="android.appwidget.provider"
                              android:resource="@xml/appwidget_info"
                              />
              </receiver>
              
  • Adding the AppWidgetProviderInfo meta-data
    • AppWidgetProviderInfo는 widget의 크기와 update period, 그리고 layout 등을 정의한 xml 형식의 문서이다.
    • 위 예제에서 android:resource="@xml/appwidget_info를 말하며 해당 xml 파일은  res/xml/appwidget_info.xml에 위치한다.
    • Xml 파일로 표현된 attributes는 이후 AppWidgetProviderInfo클래스로 document화 된다.
          <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
              android:minWidth="40dp"
              android:minHeight="30dp"
              android:updatePeriodMillis="86400000"
              android:initialLayout="@layout/test_appwidget"
              android:configure="com.android.tests.appwidgethost.TestAppWidgetConfigure"
              >
          </appwidget-provider>
          
  • Using the AppWidgetProvider class
    • Widget을 생성하여 사용하려면 안드로이드에서 제공하는 AppWidgetProvider 클래스를 사용하는 것이 좋다.
    • 명심할 것은 AppWidgetProvider는 BroadcastReceiver의 extended 클래스 이므로 BroadcastReceiver의 lifecycle에 영향을 받아 해당 process가 callback을 받은 후에도 지속적으로 동작하고 있는지를 보장할 수 없다는 것이다.
      • 즉 시스템의 메모리정책에 따라 다른 component와의 우선순위에서 떨어지면 destroy 될 수 있다.
  • AppWidget Configuration UI
    • Widget host는 widget이 instantiate 될 때 configuration activity를 실행시킬 수 있다.  Configuration activity는 AndroidManifest.xml에 일반 다른 activity와 마찬가지로 선언되어 있어야 하며, AppWidgetProviderInfo xml 파일에 android:configure attribute에 list 되어 있어야 한다.
    • ACTION_APPWIDGET_CONFIGURE action을 통해 launch 된다.
  • AppWidget Broadcast Intents
    • AppWidgetProvider는 단지 편의상 제공하는 클래스이다.  Widget broadcasts를 직접 받고 싶다면 그렇게 하면 된다.  다음은 widget 관련 intent이다.
      • ACTION_APPWIDGET_UPDATE
      • ACTION_APPWIDGET_DELETED
      • ACTION_APPWIDGET_ENABLED
      • ACTION_APPWIDGET_DISABLED
    • onReceive(Content, Intent)의 implementation은 비교적 심플하다.
          public void onReceive(Context context, Intent intent) {
              // Protect against rogue update broadcasts (not really a security issue,
              // just filter bad broacasts out so subclasses are less likely to crash).
              String action = intent.getAction();
              if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
                  Bundle extras = intent.getExtras();
                  if (extras != null) {
                      int[] appWidgetIds 
                             = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                      if (appWidgetIds != null && appWidgetIds.length > 0) {
                          this.onUpdate(context, AppWidgetManager.getInstance(context)
                                                                        , appWidgetIds);
                      }
                  }
              }
              else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
                  Bundle extras = intent.getExtras();
                  if (extras != null) {
                      int[] appWidgetIds 
                             = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                      if (appWidgetIds != null && appWidgetIds.length > 0) {
                          this.onDeleted(context, appWidgetIds);
                      }
                  }
              }
              else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
                  this.onEnabled(context);
              }
              else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
                  this.onDisabled(context);
              }
          }
          
  • AppWidget Hosts
    • Widget host는 widget이 위치하는 container이다.  
.

*/

'Android' 카테고리의 다른 글

SharedPreference 기능  (0) 2010.09.08
안드로이드 기본 위젯  (0) 2010.09.08
AppWidgets  (0) 2010.09.08
안드로이드 위젯(widget)  (0) 2010.09.08
안드로이드 기본 프로젝트 생성  (0) 2010.09.08
메니페스트 파일  (0) 2010.09.08