Mobile Widget到底是個什么玩意?
Widget與移動設備
Widget是什么?
Widget 是一個廣泛的概念,從其字面意思可以翻譯成小物件,小工具,小軟件。Widget的實現(xiàn)可以多種多樣,但是都有一個共同特性,即可以源碼復用。換句話說,Widget軟件只要開發(fā)一次,便可以在具有該Widget運行引擎平臺下完美的運行,具有完全一樣的功能,UI風格和用戶體驗方式。
從 Widget的實現(xiàn)方式上來說主要有兩種,一種是基于DHTML, JAVASCRIPT和CSS技術的Widget。另一種是基于Adobe Flash技術的Widget。目前大多數(shù)Widget實現(xiàn)還是基于前者,尤其是目前日漸流行的移動設備上的Widget技術均指Web Widget。
Widget的特點
- 小尺寸:Widget的尺寸通常都不大,并且運行速度比較快,占用的系統(tǒng)資源也較少。
- 形式多樣:Widget的展現(xiàn)方式可以多種多樣,可以是一個懸浮在窗口里的小圖標,可以是占用全屏的全屏應用,也可以是插入某個應用子窗口中的小程序。
- 功能多樣:Widget應用可以提供的功能可以多種多樣(依賴Widget引擎提供的功能),如提供新聞資訊閱讀,視頻觀看,系統(tǒng)狀態(tài)監(jiān)視,天氣預報,股票信息,時鐘,聯(lián)系人管理,短信接收發(fā)送等。
- 美觀:Widget應用設計的一般都比較漂亮,并且具有很好的用戶體驗和操作方式。
- 個性化強:由于Widget的小尺寸和多樣的形式和功能,因此用戶可以隨意的安裝、擺放和設置Widget,達到個性化的Widget展示和使用效果。
- 開發(fā)方便:由于大多數(shù)Widget都是基于Web技術或者Flash技術,并且這兩種技術都已經(jīng)發(fā)展成熟,提供大量的集成開發(fā)環(huán)境以及可以復用的代碼。因此,開發(fā)人員可以很快速的開發(fā)出功能強大、界面美觀的Widget應用。
Widget應用
- 桌面電腦上的Widget
-
- Yahoo Widget
- Mac OS dashbord
- Windows Vista側邊欄
- Windows 7桌面小工具
- 移動終端上的Widget
- 個性化首頁中的Widget
-
- Netvibes
- iGoogle
- 博客中的Widget
移動平臺上的Widget規(guī)范(Web Widget)
目前,移動平臺上支持的Widget運行環(huán)境主要遵循三套規(guī)范:W3C Widget規(guī)范、BONDI Widget規(guī)范和JIL Widget規(guī)范。
- W3C Widget規(guī)范
該規(guī)范是由W3C組織制定,包含6個子規(guī)范,主要定義了Widget的運行時狀態(tài),打包和配置,數(shù)字簽名,自動升級,以及核心API和事件處理。
- BONDI Widget規(guī)范
該規(guī)范由OMTP組織制定,對W3C Widget規(guī)范進行了擴充。嚴格定義了Widget的安全驗證體系,豐富了API接口。目前W3C組織考慮將BONDI規(guī)范納入到標準中。
- JIL Widget規(guī)范
該規(guī)范是由中國移動、沃達豐、軟銀以及Verizon共同提出和定義的Widget規(guī)范。該規(guī)范目前主要是被中國移動的BEA平臺所支持。
Widget引擎
Widget引擎的作用
Widget引擎為安裝、運行、管理、升級,驗證Widget應用提供了一整套完整的框架體系。
- 安裝
Widget的發(fā)布方式可以多種多樣,可以是基于Web頁面的發(fā)布方式也可以是基于安裝包的發(fā)布方式,因此Widget引擎需要對各種發(fā)布方式兼容,將用戶的Widget應用安裝和部署到當前的Widget運行環(huán)境中。
- 運行
Widget應用有其自身的生命周期(初始化,運行,暫停,恢復,終止),因此Widget引擎有責任管理每個Widget應用的生命周期,在Widget不同的階段執(zhí)行Widget內(nèi)部定義的事件處理代碼。
- 管理
Widget引擎負責像用戶提供已安裝Widget應用的管理功能,用戶可以通過Widget引擎查看當前運行的Widget運行狀態(tài),占用的系統(tǒng)資源,終止應用,運行應用以及刪除應用。
- 升級
Widget引擎會根據(jù)Widget的配置文件定期的檢測Widget的版本,并且動態(tài)的更新Widget應用。
- 驗證
出于安全性的考慮,Widget應用都需要進行簽名,并且需要顯示的聲明其需要使用的特殊功能接口。并且在運行時刻,Widget引擎需要對Widget調用受限接口的合法性進行驗證。
Widget引擎與瀏覽器的關系
由于Web Widget應用采用DHTML、JAVASCRIPT和CSS技術實現(xiàn),因此運行Widget需要瀏覽器引擎作為支持。但是通常的瀏覽器引擎不足以支撐 Widget的應用。比如:Widget規(guī)范中嚴格的定義了Widget的打包方式,尤其固有的配置和部署方式,通常的瀏覽器引擎是無法識別并且按照規(guī)范要求正確安裝和部署的。某些Widget規(guī)范中定義了Widget應用對設備能力的訪問,這也是通常瀏覽器引擎所不支持的。因此,如果瀏覽器需要支持某個特定Widget規(guī)范需要對瀏覽器引擎進行擴展,對Widget規(guī)范中定義的打包發(fā)布、升級安裝、安全驗證以及設備相關的API進行擴展和支持。
這里還有一類Widget不需要訪問設備功能,并且并不遵循某套特定的Widget規(guī)范,而只是以Web頁面中的一個小控件或者小程序形式出現(xiàn),該 Widget應用是不需要對瀏覽器做擴展。但由于沒有一套標準統(tǒng)一的規(guī)范標準作為支持,因此只能由該站點開發(fā)者自己去設計并且開發(fā),不具有廣泛性。
Widget引擎框架設計
這里的Widget引擎框架主要是以Android平臺上的Widget引擎的設計為基礎,所支持的標準不限(可包括W3C,BONDI,JIL規(guī)范)。
Widget引擎框架

- Widgets
如上圖所示,Widget表示該Widget引擎所支持的各種Widget應用,該應用采用DHTML, JAVASCRIPT, CSS技術編寫和實現(xiàn)。該Widget引擎所支持的Widget種類完全依賴于APIs Implement部分。
- Widget Module Loader
模塊載入器的主要作用有兩個:第一,負責各個已實現(xiàn)的Widget規(guī)范API模塊的初始化。第二,負責在瀏覽器DOM樹中注冊載入的API模塊對象,以使得Widget應用中可以使用相應的接口、對象和屬性。
- Application Management
應用程序管理模塊負責Widget應用的生命周期管理、應用程序的下載安裝,以及應用程序的刪除。應用程序管理模塊與Widget DOM對象有緊密聯(lián)系。比如:Widget應用在初始化階段為resume事件注冊了回調函數(shù),在該函數(shù)中會對暫停時的應用數(shù)據(jù)進行恢復操作。應用程序管理模塊在接收到Widget的恢復事件時,有責任調用該應用注冊的resume回調函數(shù),并且執(zhí)行其定義的恢復操作。
- Security Management
安全管理模塊負責Widget應用的安全驗證。比如在Widget應用安裝時,安全管理模塊需要對Widget應用簽名的合法性進行驗證,并且對 Widget聲明的設備接口使用權限進行驗證。當Widget運行時,Widget應用訪問某個設備接口(比如Camera),安全管理模塊需要對該應用是否有權訪問該設備接口進行驗證。
- APIs Implement
API實現(xiàn)包含了各個Widget引擎需要支持的Widget規(guī)范的底層實現(xiàn)。該部分的實現(xiàn)可以是純JAVA實現(xiàn)、可以是JAVASCRIPT和JAVA混合實現(xiàn)、可以是JAVA和C/C++混合實現(xiàn)、亦可以是純C/C++實現(xiàn)。
Widget引擎實現(xiàn)方式
基于WebKit引擎的擴展實現(xiàn)
該實現(xiàn)方式直接修改和擴展WebKit引擎,在引擎內(nèi)部創(chuàng)建widget的DOM對象,并且提供抽象的調用方法。除此之外,需要在WebKit引擎中實現(xiàn)對各個規(guī)范模塊的調用機制。
- 基于JAVA語言的模塊調用
該實現(xiàn)方式需要對WebKit引擎實現(xiàn)JAVASCRIPT語言和JAVA語言之間的平滑調用機制。即Widget應用訪問widget對象的某個API接口時,WebKit引擎需要將該SCRIPING對象動態(tài)的轉換成相應的JAVA對象,并且調用其相應的方法。并且,將該JAVA方法執(zhí)行后的結果動態(tài)的轉換成JAVASCRIPT對象,并且返回給Widget應用。
采用該機制實現(xiàn)的API模塊均用可采用JAVA語言來實現(xiàn)。因此,該實現(xiàn)方式具有實現(xiàn)速度快的特點,但是也正因為與JAVA語言的緊密關系移植性不好。
- 基于C/C++語言的模塊調用
所有的API模塊的擴展均采用C/C++語言來實現(xiàn),這類似gears的實現(xiàn)方式。引擎內(nèi)幕會將Widget應用使用的JAVASCRIPT方法動態(tài)轉換成定義的C/C++對象,并且執(zhí)行相應的方法。而后將返回結果轉換成JAVASCRIPT方法返回給Widget對象。
采用該機制實現(xiàn)的API模塊均采用C/C++語言來實現(xiàn),因此開發(fā)周期相對較長,但是具有良好的移植性。
采用WebKit引擎擴展實現(xiàn)方式,可以讓瀏覽器引擎原生的對Widget應用進行支持,但是在每次WebKit升級時,需要對修改的代碼進行合并和再發(fā)布。
基于WebKit插件的擴展實現(xiàn)
該實現(xiàn)方式基于NPAPI插件擴展技術的基礎之上。將Widget的DOM對象實現(xiàn)包含在NPAPI插件中,當瀏覽器檢測到該對象的訪問時,動態(tài)的載入該NPAPI插件,并且將所有對Widget DOM對象的訪問操作均轉發(fā)給NPAPI插件來完成。
NPAI插件的實現(xiàn)方式如WebKit引擎擴展實現(xiàn)一樣,也有JAVA和C/C++兩種實現(xiàn)方式,這里不再重復。
采用該實現(xiàn)方式的擴展無需對WebKit引擎修改,但是需要按照NPAPI規(guī)范,實現(xiàn)完整的SCRIPTING插件。
基于C/S架構的擴展實現(xiàn)
該實現(xiàn)方式采用借用了C/S設計模式的思想。在Widget引擎初始化階段會啟動一個內(nèi)部的服務,該服務會監(jiān)聽系統(tǒng)中某個端口。Widget引擎運行時,如果訪問Widget對象的某個方法時,封裝的Widget JS對象會向服務端口發(fā)送方法請求。服務端接受請求后,首先會對請求進行合法性驗證和分析,然后調用相應的接口來完成實際的操作。并且將結果以異步的方式返回給封裝的Widget JS對象,而由該對象通知Widget應用操作結果。
C/S架構的擴展實現(xiàn)也可以采用JAVA和C/C++實現(xiàn)方式,這里不再重復。
采用該方式實現(xiàn)的擴展有良好的靈活性,不同的Widget規(guī)范定義的Widget應用只需要包含相應的Widget封裝JS包即可正確運行。但是由于采用C/S模式的調用方式,因此在執(zhí)行效率上略低于直接調用的方式。
Browser&Widget
這部分對Browser的設計提出一個概念層面上的設計。如下圖所示:

- Table Manager
負責管理瀏覽器中各個Table頁面,每個Table頁面是一個獨立的Web頁面或者Widget應用。
- Bookmark Manager
負責管理書簽,該書簽包括用戶收藏的網(wǎng)站URL以及喜愛的RSS頻道和文章信息。
- RSS Manager
負責RSS頻道的訂閱、RSS新聞列表、RSS頻道退訂
- Plugin Manager
負責管理已經(jīng)安裝的瀏覽器插件
- Notification Manager
負責事件通知管理,比如RSS新聞數(shù)據(jù)的更新通知,瀏覽器插件的升級通知,Widget升級通知等。
- History Manager
負責記錄當前Table的運行數(shù)據(jù),包括訪問的URL歷史,當前窗口大小位置信息,可用于當瀏覽器crash后的狀態(tài)恢復操作。
- Download Manager
負責瀏覽器的下載管理,包括android軟件的下載、安裝,Widget軟件的下載、安裝
- Gesture Manager
負責手勢操作的自定義操作管理。
- Thread Manager
為了加快瀏覽器的載入效率,每個Table在一個單獨的線程中運行,因此對線程的運行狀態(tài)需要一個統(tǒng)一管理機制。
- Skin Manager
負責Browser外觀的管理,用戶可以通過該模塊動態(tài)的給系統(tǒng)更換皮膚和顯示方式。
- Widget Manager
負責Widget引用的下載、安裝、刪除、以及運行時環(huán)境的支持。