Android AppWidget系統框架

尊重作者原創版權,原文出處:點擊打開鏈接


本文簡要描述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 Hierarchy

圖一、AppWidget系統框架圖

 

AppWidget實現Remote端提供UI元素;Local端具體顯示。AppWidgetHost在AppWidget系統中是Local端;AppWidgetProvider端是Remote端。AppWidgetHost和AppWidgetProvider直接或通過IAppWidgetService或間接的通過AppWidgetManager,與AppWidgetService實現交互。AppWidgetService是所有元素的總管,負責協調其他各個部分。

 

二、AppWidget中各個角色職能的簡要分析

 

2.1 AppWidgetHost


 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

 

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。

發佈了20 篇原創文章 · 獲贊 25 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章