這幾天在看 appwidget 相關文件時, 覺得 Documents 裡面的描述對於剛接觸 android 的人而言,
不是那麼淺顯易懂, 再加上 Android 裡面的 sample code 寫的太過龐大, 一開始很難從裡面分離
出最簡單的 sample. 所以就上網找了些資料, 以及去看 Android 的 source code 來和 document
裡面的內容做比對, 終於有了一個最初步的了解. 以下寫了一個簡單的 appwidget sample. 利用
這個 sample 來了解 widget 在 android system 上的基本運作流程.

1. 利用 android 工具創建一個 HelloWidget
2. 修改 AndroidManifest.xml
   在 intent tag 裡面新增 action tag,
   針對 widget 裡的 action tag 可以指定多個 action ,每個 action 對應到 AppWidgetProvider
   裡面的 OnUpdate, onDeleted, onEnabled, onDisabled
   action, 此四種 action 所相對應的 xml tag value 以及對應的 function 如下:
   onUpdate   - "android.appwidget.action.APPWIDGET_UPDATE"
   onDeleted  - "android.appwidget.action.APPWIDGET_DELETED"
   onDisabled - "android.appwidget.action.APPWIDGET_DISABLED"
   onEnabled  - "android.appwidget.action.APPWIDGET_ENABLED"
   若實作的 class 沒有 overwrite AppWidgetProvider 裡的 onReceive Function, 此 Class 就會
   依照 XML 裡面所指定的 action 來呼叫相對應的 Function
   
  20090819-AppWidgetProvider.JPG 
   
   指定 action name 為 "android.appwidget.action.APPWIDGET_UPDATE"  
   另外要新增 meta-data tag, 主要指定一個可以提供 AppWidgetProviderInfo 所需要資訊的 XML
 

   20090819-AndroidManifest.JPG    

  
3. 在 res/xml/ 裡面新增hello_widget_provider.xml , 內容主要是指定寬, 高, 更新週期以及 Layout
   20090819-hello_widget_provider.JPG   
4. 新增一個只有繼承 AppWidgetProvider 且毫無實作的 HelloWidget.class
  20090819-helloWidget-1.JPG 

執行畫面如下

20090819-helloWidget-1-run.JPG 

至目前為止已經實作一個極其簡單的 widget, 剛剛有提到會利用這個 sample 來了解一些基本的
流程. 所以我們再將 HelloWidget 做一個簡單的修改
20090819-helloWidget-2.JPG 
  
經過這樣修改之後, 利用 adb logcat 來觀看輸出的訊息, 會看到如下的輸出:
  

[將 HelloWidget 安裝到 HomeScreen 時]
D/HelloWidget(  773): onReceive
D/HelloWidget(  773): onReceive - ACTION_APPWIDGET_ENABLED
D/HelloWidget(  773): onReceive
D/HelloWidget(  773): onReceive - ACTION_APPWIDGET_UPDATE

[XML 裡定義的 updatePeriodMillis 定期更新時]
D/HelloWidget(  773): onReceive
D/HelloWidget(  773): onReceive - ACTION_APPWIDGET_UPDATE

[將 HelloWIdget 從 HomeScreen 移除時]
D/HelloWidget(  773): onReceive
D/HelloWidget(  773): onReceive - ACTION_APPWIDGET_DELETED
D/HelloWidget(  773): onReceive
D/HelloWidget(  773): onReceive - ACTION_APPWIDGET_DISABLED

由上面輸出結果觀察, 不管是 update, deleted, enabled , disabled, 都會統一經過 onReceive dispatch.
經由覆寫 onReceive 以及適當的修改, 就可以將這些 function 的調用時機完全控制. 除了這個也會對
XML 裡面所定義的那些 action 以及如何被調用都會有比較清楚的了解

創作者介紹
創作者 tixirene 的頭像
tixirene

Tix irene~愛.仁.茹.己~tixirene

tixirene 發表在 痞客邦 留言(1) 人氣()


留言列表 (1)

發表留言
  • peterlawn
  • android api的設計真的很糟,我是從 actionsript 跳過來寫 android 的,非常同意你說的 : )