天天看點

Widget 詳解

AppWidget 詳解

最近又寫了一個Widget,第二次寫了,許多之前沒有搞清楚的東西,這次更加清楚了一些。首先記錄一下AppWidget的基本架構,Widget更新條件,然後把兩次寫Widget的基本流程記錄下來供今後查閱。

先說幾句題外話,首先是覺得,總是周而複始的重複一件工作,比如修改程式bug,真累,覺得總在打醬油,自己也難受,到不如動手寫程式,我知道,這是耐心不夠的表現。另外,剛看到了一篇将程式員經驗的文章,一會兒轉過來。

今天還知道了,打更的更念geng(一聲),這個拼音音調不會打,自己之前想到的要把uft8啦gbk啦的編碼弄清楚也沒有弄清楚。從以往的表現來看,腦袋裡的想法付諸于時間,基本最短還要兩個月的時間,這樣也就錯過了很多機會。

AppWidget的基本架構是,手邊沒書,靠記憶說了,桌面launcher裡面有一個AppWidgetHost,用來支援桌面上放置的 Widget,這個如果不動launcher的話,一般不會用到。據說下一代系統支援在Activity中調用Host,也就自然可以在Activity 裡防止Widget,具體不知,或許現在就可以。

接下來是AppWidgetInfo,通常就是res/xml裡面的widget.xml,xml的命名貌似隻能用小寫,也可以在.java裡面實作這個Info,不過一般xml裡更加簡單,是以就都寫在這裡了。

下面就是真正的AppWidget,由它來控制整個Widget,但是有很大的局限性,不僅可以實作的布局很少,隻有3類布局,7種還是9種控件,發揮的餘地就很小,當然也不是完全不能發揮,隻是都要自己動手寫,比較麻煩。 AppWidgetProvider中繼承幾個on方法,可以在對應時間的時候自動調用,一般用到的就是onUpdate,用來更新UI。其次 AppWidgetProvider内不支援線程,線程需要在另外啟動的支援的類裡使用,如Activity or Service。最後,聽說AppWidget不支援animation,我想寫至今還沒有來得及實作,不行就隻能連續的重新整理圖檔咯。

關于AppWidget,或者說是重新整理UI的條件,更新Widget UI的條件有三個:

1,每生成一個Widget都對應一個AppWidgetId,需要對這個Id進行重新整理,這也是onUpdate函數中對這個Id數組周遊for的含義。

2,Widget中的UI是通過一個RemoteView類實作的,根據字面含義,這個View是允許其他遠端程式調用并更新的,此為 remote的含義。RemoteView支援的元件很少,剛才說過。在程式中,我好像看到了,這個RemoteView的執行個體必須隻有一個,就是必須是同一個,否則更新無效,這個還需要進一步驗證。貌似别人也沒怎麼說。

3,AppWidgetManager,由它的update方法加參數實作目前的Widget視圖更新。

有了這3個條件,可以在任何的Activity或是Service裡面更新Widget的UI。

我又想說說看代碼的問題,看了一個代碼,每個函數都在一屏以内,符合經常聽到的優秀代碼的樣式,比較牛。看别人的代碼怎麼就那麼累呢?看不懂,變量名記不住。但是,在實際的開發中,多看代碼無疑是有好處的,今天就體會到了兩處。稍後奉上。

我建立一個新的AppWidget骨架的流程是:

1,建立工程,修改Manifest,AppWidget實際繼承的是Broadcast,是以标簽是<receiver>,重要的是在其中加上meta-data資訊,表示它是一個Widget。關于其他用到的,activity什麼的,可以修改category讓它不顯示出來,category的東西有空我還要查查。

記得添加必要的permission。

2,添加java檔案,傳說中的AppWidgetProvider,自動添加裡面的幾個on回調函數。實作自己的邏輯。

在AppWidgetProvider中,利用intent,可以啟動3個類,分别是(send)Broadcast,Activity和Service。其中Service可以綁定Broadcast receiver,這個比較有用。

既然Widget什麼都不支援,很多東西可以用廣播通知Service去做!

3,添加AppWidgetInfo,就是res/xml下的檔案,是對Widget的說明檔案,定義寬高什麼的,定義自動重新整理時間,據說這個功能在最近的版本中已經取消了,定時重新整理現在都是用Service + 定時實作的,實際程式中也确實沒用,不知道為什麼。

這裡另外一個要說明的就是configure,今天剛剛實作。它是一個activity,可以在加載Widget到螢幕之前進行一些必要的設定,可選。需要注意的是,configure要負責第一次更新Widget的UI,否則Widget無法畫到螢幕上去。

4,最後在AppWidgetProvider中,啟動的Activity或者Service中,完成邏輯操作。修改必要的關聯名稱,就可以實作一個簡單的Widget啦。

今天從菜市口下了幾個Widget應用,發現有許多做的相當不錯,自己做的東西雖然隻有雛形,就已經顯示出了落後。看來,在軟體寫好,到一定階段,必要的重構是必不可少的,一定不要舍不得!删掉備援代碼的時候,不要舍不得。

今天話怎麼這麼多這麼啰嗦。代碼例子有機會再來補上。