BlackBerry Widget開(kāi)發(fā)進(jìn)階
在入門(mén)篇中,我們討論了如何應(yīng)用Blackberry提供的Widget API來(lái)進(jìn)行開(kāi)發(fā),從如下鏈接中http://www.blackberry.com/developers/docs/widgetapi/

可以找到BlackBerry能提供的所有Widget API列表。然后,對(duì)于很多應(yīng)用開(kāi)發(fā)來(lái)說(shuō),widget開(kāi)發(fā)過(guò)程中,有些需求是系統(tǒng)API所不能滿足的,還有一種應(yīng)用場(chǎng)景是用戶需要把原有Java系統(tǒng)的代碼和功能與widget技術(shù)結(jié)合起來(lái)。為了滿足這兩種開(kāi)發(fā)和應(yīng)用的需求,widget也提供了擴(kuò)展機(jī)制,能夠滿足用戶的這種需求。本文就以一個(gè)擴(kuò)充Widget的API來(lái)實(shí)現(xiàn)手機(jī)在javascript中調(diào)用widgetapi來(lái)實(shí)現(xiàn)手機(jī)震動(dòng)功能,這個(gè)API在標(biāo)準(zhǔn)Widget API中是沒(méi)有實(shí)現(xiàn)的。
開(kāi)發(fā)工具下載
在進(jìn)行Widget開(kāi)發(fā)之前,開(kāi)發(fā)人員需要下載相應(yīng)的開(kāi)發(fā)工具,BlackBerry eclipse plug-in。本文使用的BlackBerry javaPlug-in for Eclipse版本為:v1.1.1(下載地址如下):
http://na.blackberry.com/eng/developers/browserdev/eclipse.jsp
這個(gè)plug-in的作用是給用戶開(kāi)發(fā)Widget擴(kuò)展API使用的。
開(kāi)發(fā)具體步驟
步驟一
啟動(dòng)Eclipse,File New Project,選擇BlackBerry Project,然后選擇Next:

步驟二
在接下來(lái)的對(duì)話框,輸入project的名字My Widget Extension,然后選擇Next

步驟三
接下來(lái),會(huì)出現(xiàn)project的視圖,圖中可以看到系統(tǒng)已經(jīng)添加了新的project,在project的src目錄下點(diǎn)擊右鍵,然后添加一個(gè)package名字為widgetpackge。

步驟四
在新建好的widgetpackage上點(diǎn)擊右鍵,添加一個(gè)新的class,名為Alert Sample,讓他繼承net.rim.device.api.script.Scriptable.

步驟五
添加好的class的基本框架如下所示:

這個(gè)class的作用是用來(lái)映射在Widget應(yīng)用中的調(diào)用邏輯。當(dāng)在JavaScript的代碼中通過(guò)”.”操作符號(hào)調(diào)用擴(kuò)展的API時(shí),get Fiel()便會(huì)被調(diào)用。這個(gè)函數(shù)在Alert Sample中的實(shí)現(xiàn)如下:當(dāng)它被調(diào)用后,便會(huì)檢查當(dāng)前device中vibrate功能是不是被支持。

步驟六
然后,添加一個(gè)vibrateclass類,讓他繼承自net.rim.device.api.script.ScriptableFunction.

步驟七
添加好的class的代碼框架如下所示:

在自動(dòng)生成的代碼框架中加入如下代碼,這段代碼的作用是讓設(shè)備震動(dòng)一段時(shí)間。

步驟八
接下來(lái),我們將把AlertSample和vibrate兩個(gè)class連接起來(lái)。在AlertSample中加入如下代碼:

這些代碼的作用是讓Alert Sample能夠調(diào)用vibrate的實(shí)例,然后在Alert Sample的getField()中加入如下函數(shù)實(shí)現(xiàn)代碼

步驟九
***,添加Sample Extension class到項(xiàng)目中,創(chuàng)建class的時(shí)候確保public和final修飾符被選中,讓sample ext ension class繼承自net.rim.device.api.web.Widget Extension.
步驟十
生成好的class框架如下所示:

這里的幾個(gè)主要方法的作用描述如下:
get Feature List()–這個(gè)方式是為了給widget引擎提供我們新的widget擴(kuò)成能提供的feature list列表,如基礎(chǔ)篇介紹,這里的feature就是widget開(kāi)發(fā)過(guò)程中可以加入的access的資源。
load Feature()–這個(gè)方法是當(dāng)widget使用相應(yīng)的widget engine提供的feature時(shí)候,可以執(zhí)行的一些任務(wù),這個(gè)一般就是widget引擎加載進(jìn)來(lái)我們extensionapi的入口點(diǎn)。
register()–這個(gè)方法提供一個(gè)入口插入點(diǎn),擴(kuò)充的widget程序可以自動(dòng)執(zhí)行一些對(duì)當(dāng)前widget配置文件和瀏覽器的操作。
unloadFeatures()–這個(gè)是一個(gè)入口點(diǎn),可以加入一些邏輯,如果需要做一些清理工作當(dāng)widget退出出這個(gè)api調(diào)用的時(shí)候。
步驟十一
在上步生成的SampleExtension的getFeatureList中添加如下代碼:

在loadFeature中,添加如下代碼:

步驟十二
在完成widget擴(kuò)充api的具體開(kāi)發(fā)和定義工作之后,剩下的就是把widget發(fā)布到BlackBerry的widget平臺(tái)中,這一步是通過(guò)export相應(yīng)的Java文件完成的。根據(jù)基礎(chǔ)篇里面的信息,我們需要把我們做好的java文件export到相應(yīng)的widget sdk的目錄下。右鍵選擇項(xiàng)目,然后選擇Export

在出現(xiàn)的對(duì)話框中,選在general下的filesystem然后下一步:

不管是用戶使用Blackberry的widget sdk還是基于eclipse的web plug-in做widget開(kāi)發(fā)發(fā)布,我們都需要把這里做出來(lái)的java文件export到相應(yīng)widget sdk安裝目錄下的devicet emplates目錄下。在上圖中選擇Export之后,在出現(xiàn)的對(duì)話框中選中src目錄,確保源文件會(huì)被export出來(lái)。

這里的Todirectory,選擇為相應(yīng)的開(kāi)發(fā)機(jī)器上的widget sdk(或者web plug in-in for eclipse安裝好之后的plugins目下下的)安裝錄下的device_templates目錄。在完成了export之后,可以看到在blackberry的widgetsdk的package目錄下,會(huì)出現(xiàn)相應(yīng)的source文件

步驟十三
出了發(fā)布source文件在widget平臺(tái),我們還需要修改系統(tǒng)的API列表訪問(wèn),這樣才能***在widget中訪問(wèn)調(diào)用到我們新添加的API。

修改其中的Widget Config Impl.java,加入如下黑體的內(nèi)容
- pro tecte d W i d g etC on f i g I m p l() {
- _ cus to m Head er s = n e w Http H ead er s () ;
- _ n o tif icat io n s = n e w Has h tab l e() ;
- _ ac ce ss Lis t = n e w Has h tab le() ;
- _ f ea tu r eT ab le = n e w Ha sh tab l e() ;
- _ w id g etE x te ns io n s = n e w Vec tor() ;
- //s et d ef a u lt s s etVer sio n () ;
- _ w id g etE x te ns io ns .add Ele m e n t(
- n et.r i m .d e v ice. ap i. w eb .j s e.B lack B err y W id g etT oo lk it.g etIn s t an ce()) ;
- _w id ge tExte n sion s.a d d Eleme n t( n e w w id ge tpac k age .S am p leExte n sion () );
- }
步驟十四
所有的這些設(shè)置做完之后,剩下來(lái)的就是要測(cè)試運(yùn)行了,如開(kāi)發(fā)入門(mén)中的方式我們可以添加一個(gè)新的widget。在你的計(jì)算機(jī)上創(chuàng)建一個(gè)c:\widget\alert目錄(也可以工作在別的目錄),在這個(gè)目錄中生成兩個(gè)index.html和config.xml文件,正如基礎(chǔ)篇介紹的那樣。
定義的index.html和config.xml如下所示:
- < head >
- < m et a nam e="v i ew por t " cont ent = " wi dt h= dev i ce -wi dt h; h ei ght = dev i ce- hei ght " / >
- < scri pt t y pe=" t ext/ J av aScri pt " >
- f uncti on v i br at eA l ert( ) {
- i f ( sa m pl e.al er t .vi br at eSuppo rt ed)
- {
- }
- el se
- }
- sa m pl e.al ert .v i br at e( 10 00) ;
- al ert( ' ext ensi on not support ed' ) ;
- < / scri pt >
- < / head >
- < body >
- < di v >
- < i nput t y pe=" subm i t " v a l ue=" A l ert " oncli ck="v i br at eA l ert() " />
- < / di v >
- < / body >
- < / ht m l >
Config.xml的內(nèi)容如下:
- < ? xm l v er si on= " 1.0" encodi ng= " ut f- 8" ? >
- < wi dget xm l ns=" htt p:/ / ww w . w 3.or g/ ns/ wi dget s" xm l ns: r i m = " htt p: / / ww w .bl ackber r y .co m / ns/ w i dget s" v er si on= " 1.0.0" >
- < nam e> A l er t W i dget < / nam e>
- < des cri pti on>
- Sam pl e wi dget t hat dem onst r at es how t o use
- t he A l er t A P I t o v i br at e t he Bla ck Berr y S m art phone
- < / des cri pti on>
- < aut hor hr ef = " htt p://w w w .r i m .co m / "
- r i m : cop y ri ght = " no cop y ri ght "
- em ail = " aut hor _nam e@aut hor dom ai n.com " > Com pany N am e ? A ut hor N a m e
- < / aut hor >
- < cont ent sr c = " i ndex.ht m l " / >
- < f eat ur e i d= " sa m pl e" />
- < /wi dget >
在入門(mén)文檔中,我們是通過(guò)eclipse自動(dòng)打包這兩個(gè)文件成cod的,這里我們也可以使用另外一種手工通過(guò)bbwp打包工具完成這一步,先zip然后生成cod。
首先把這兩個(gè)文件壓縮為一個(gè)zip包,名為alert.zip
然后執(zhí)行如下命令

這里的bbwp.exe位于安裝好的widget sdk的目錄下面。在執(zhí)行完上述命令后在命令行出可以看到如下輸出,***在zip同級(jí)目錄下會(huì)生成一個(gè)bin目錄,如果基礎(chǔ)篇介紹的,bin目錄下,我們可以發(fā)現(xiàn)***生成的cod文件。

驗(yàn)證
完成這一步,就可以把模擬器自動(dòng)啟動(dòng)了.***在模擬器中或者真機(jī)上,就可以看到我們的widget的效果,如果上一篇基礎(chǔ)篇的介紹那樣,到這里,一個(gè)基于我們新的擴(kuò)充的widget的開(kāi)發(fā)API的新的widget的開(kāi)發(fā)就完成了。點(diǎn)擊Alert按鈕,就可以體驗(yàn)我們新添加的API能提供的功能了。

【編輯推薦】