2013年1月18日 星期五

Android - App Widget - 基本概念

1. 需繼承AppWidgetProvider,該類別繼承自BroadcastReceiver,所以在AndroidManifest.xml註冊時需要使用receiver。
2. 對於App Widget一定需要加上接收android.appwidget.action.APPWIDGET_UPDATE這個ACTION的Intent-filter,因為當AppWidgetManager要更新時,會對App Widget進行該動作的Broadcast,至於其它的ACTION會隱含接收,所以不明確指定也會接收以下ACTION:
  • AppWidgetManager.ACTION_APPWIDGET_DELETED
  • AppWidgetManager.ACTION_APPWIDGET_ENABLED
  • AppWidgetManager.ACTION_APPWIDGET_DISABLED
  • AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED
3. 必需在AndroidManifest.xml裡指定AppWidgetProviderInfo的xml檔,主要是用來描述App Widget的相關描述,例如:
<meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info"/>。
  • updatePeriodMillis:為了電池的使用長度,通常更新並不會一定在所設定的時間內執行,Google建議每一個小時不要更新超過一次,如果設備正在睡眠,也會在指定的時間進行更新,如果想要更新的更加頻繁,或者不想要在設備睡眠時進行更新,則可以在Configuration Activity使用AlarmManager來發起更新。
  • resizeMode:App Widget可以Resize的模式有"horizontal"、"vertical"、"none",如果要水平及垂直都允許的話,可以設置為"horizontal|vertical"。
  • previewImage:指定App Widget在選擇區時所呈現的預覽圖片,如果沒有指定就依程式預設的圖示呈現,Android 3.0開始支援。
  • android:previewImage="@drawable/preview"
  • widgetCategory:Android 4.2(API 17)後支援讓App Widget可以呈現在鎖定畫面,該設定值有"home_screen"及"keyguard",一般沒有特別設定時,App Widget預設支援"home_screen",如果要出現在鎖定頁面,則可以設定為"keyguard|home_screen"。
  • initialLayout:指定App Widget的Layout。
  • initialKeyguardLayout:Android 4.2後,支援讓App Widget可以呈現在鎖定畫面,該設定為指定鎖定畫面所呈現的App Widget Layout。
  • minWidth & minHeight:App Widget Layout最小應該呈現的長寬,以dp為單位,為了跨平台最好不要超過4*4 Cells。
  • minResizeWidth & minResizeHeight:設定使用者在resize App Widget時,最小能夠調整到的長寬,避免調整太過頭而無法操作。
 
4. AppWidgetProvider - onEnabled:不管加入多少個同樣的App Widget,這個方法只會在第一次將App Widget加入App Widget Host中時才會執行。
 
5. AppWidgetProvider - onUpdate():該方法會在User每加入一次App Widget時便會呼叫,以及updatePeriodMillis所設定的間隔呼叫,如果有使用Configuration Activity,則使用者加入App Widget時不會被呼叫,也就是如果沒有Configuration Activity,則View的Event Handler在onUpdate()設定,如果有Configuration Activity,則在Configuration Activity中設定。
 
6. AppWidgetProvider - onDeleted:每次刪除App Widget時都會執行。
 
7. AppWidgetProvider - onDisabled:當最後一個App Widget從App Widget Host中移除時便會呼叫,在這邊對應到onEnabled中所做的工作,例如在onEnabled建立暫時資料庫,則在onDisabled就需刪除暫時資料庫。
 
8. AppWidgetProvider - onReceive:因為AppWidgetProvider繼承自BroadcastReceiver,所以會有onRecived事件,但是通常不建議自行處理該處的事件,除非有需要自行處理所接收的App Widget Broadcast,否則對應的事件應該使用之前所述的onEnabled、onUpdate、onDeleted、onDisabled即可。onRecived所處理的ACTION:
  • AppWidgetManager.ACTION_APPWIDGET_UPDATE
  • AppWidgetManager.ACTION_APPWIDGET_DELETED
  • AppWidgetManager.ACTION_APPWIDGET_ENABLED
  • AppWidgetManager.ACTION_APPWIDGET_DISABLED
  • AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED
 
9. AppWidgetProvider - onAppWidgetOptionsChanged():在API Level 16 (Android 4.1)後才支援,當App Widget進行Resize的動作或第一次置放時就會執行,可以使用getAppWidgetOptions()傳回的Bundle來取得以下的資訊:
  • OPTION_APPWIDGET_MIN_WIDTH—Contains the lower bound on the current width, in dp units, of a widget instance.
  • OPTION_APPWIDGET_MIN_HEIGHT—Contains the lower bound on the current height, in dp units, of a widget instance.
  • OPTION_APPWIDGET_MAX_WIDTH—Contains the upper bound on the current width, in dp units, of a widget instance.
  • OPTION_APPWIDGET_MAX_HEIGHT—Contains the upper bound on the current width, in dp units, of a widget instance.

轉貼請註明出處,最好直接使用聯結轉貼!Thanks~
作者: Samuel - 林靖傑
日期:2013/01/18