尊重作者原創版權,原文出處:點擊打開鏈接
本文簡要描述AppWidget系統框架,並對AppWidget系統裏的AppWidgetHost(IAppWidgetHost) / AppWidgetProvider / AppWidgetService(IAppWidgetService) / AppWidgetManager等組件做簡要的闡述。
Android中的AppWidget也就是“窗口小部件”,實現了桌面(Launcher)上顯示控件的機制,並能響應用戶的點擊操作。而實際上,提供顯示的UI元素和對點擊事件的響應是由Remote端的AppWidgetProvider實現;具體顯示是Local的AppWidgetHost通過AppWidgetHostView實現。AppWidgetHost、AppWidgetProvider與AppWidgetService和AppWidgetManager按照特有的機制組合在一起,才能完整的實現AppWidget機制。本文簡要描述AppWidget系統框架,並對這裏的組成元素做簡要的闡述。後續的文章會結合關鍵典型場景,對其中的具體角色着重描述。
一、AppWidget系統框架
下圖描述了AppWidget系統框架圖。
圖一、AppWidget系統框架圖
AppWidget實現Remote端提供UI元素;Local端具體顯示。AppWidgetHost在AppWidget系統中是Local端;AppWidgetProvider端是Remote端。AppWidgetHost和AppWidgetProvider直接或通過IAppWidgetService或間接的通過AppWidgetManager,與AppWidgetService實現交互。AppWidgetService是所有元素的總管,負責協調其他各個部分。
二、AppWidget中各個角色職能的簡要分析
2.1 AppWidgetHost
圖二、AppWidgetHost
AppWidgetHost通過IAppWidgetService利用Binder機制實現與系統進程中的AppWidgetService通信;
AppWidgetHost有IAppWidgetHost(通過Callbacks)的實現,並在AppWidgetHost.startListening()中註冊到AppWidgetService中,實現當Remote端的數據有更新時,通過IAppWidgetHost.updateAppWidget()通知AppWidgetHost更新本地的顯示;或者當Remote端的Provider改變時通知AppWidgetHost。
AppWidgetHost創建本地AppWidgetHostView時,會以AppWidgetId和AppWidgetHostView加入mViews: HashMap<Interger,AppWidgetHostView>
AppWidgetHost的典型應用是Launcher,可在《Android中Launcher對於AppWidget處理的分析:AppWidgetHost角色》中看AppWidgetHost的實現。
2.2 AppWidgetProvider
圖三、AppWidgetProvider
AppWidgetProvider是AppWidget的Remote端內容提供方,並能註冊響應其所提供內容的某個View被點擊時,響應的Intent。
AppWidgetProvider是一個抽象類,實現類需要實現抽象方法onUpdate() / onDeleted()/ onEnabled()和onDisabled()。這是AppWidgetProvider的一個模板模式實現,要求AppWidgetProvider的實現者:
- 在AndroidManefest.xml中聲明這個AppWidgetProvider是"android.appwidget.action.APPWIDGET_UPDATE"的Receiver,這樣AppWidgetProvider作爲一個BroardcastReceiver才能接收到AppWidgetService發出的消息。而AppWidgetService查詢系統中已經安裝了哪些AppWidgetProvider也是通過查詢這個接收者的Intent來的實現。所以如果沒有這個Receiver,安裝的Provider裏就沒有這個Provider,亦即,未加入到AppWidget系統中。
- 另外,這個Receiver的meta-data的name指定爲“android.appwidget.provider”;resource中用xml定義appwidget-provider內的各種屬性。這些屬性按包被安裝時,檢索出來賦給AppWidgetProviderInfo。
通常,對於應用開發來說不太注重AppWidget其他的部分,只是寫AppWidgetProvider,但一般也都稱AppWidgetProvider爲AppWidget開發。
AppWidgetProvider的典型應用是Settings裏的電量控制,可在《Android中AppWidget的分析與應用:AppWidgetProvider》中看AppWidgetProvider的實現。
2.3 AppWidgetService
圖四、AppWidgetService
AppWidgetService通過IAppWidgetService提供方法給AppWidgetHost、AppWidgetProvider使用。
在mInstalledProviders:AppWidgetService.Provider中保存AppWidgetProvider的信息;在mHost:AppWidgetService.Host中保存AppWidgetHost的信息;並用mAppWidgetIds:AppWidgetService.AppWidgetId保存AppWidgetHost與AppWidgetProvider的綁定關係。
三、AppWidget各個角色的部署
AppWidgetService運行於三個各自不同的進程空間:
- AppWidgetService運行於system_process進程;
- AppWidgetHost運行於自己的進程空間,典型的桌面上的AppWidgetHost運行於Launcher中;
- AppWidgetProvider也是運行於自己的進程空間,典型的如“電量控制”這個AppWidgetProvider運行於Settings中。
AppWidgetHost和AppWidgetProvider要用到AppWidgetService的服務時,用Binder機制通過IAppWidgetService實現。AppWidgetService通過IAppWidgetHost通知AppWidgetHost;AppWidgetService通過發Broadcast通知AppWidgetProvider。