BlackBerry應(yīng)用和MIDlet之間的交互
在前文中我們給大家介紹了如何將MIDlet應(yīng)用移植到BlackBerry,本文我們將介紹《BlackBerry應(yīng)用和MIDlet之間的交互》。
用RMS在MIDlet和BlackBerry之間共享數(shù)據(jù)
對(duì)于很多沒(méi)有BlackBerry應(yīng)用經(jīng)驗(yàn)的開(kāi)發(fā)者,或者對(duì)于很多現(xiàn)有的Java ME的系統(tǒng),如果以最小的代價(jià)和BlackBerry應(yīng)用交互,或者和BlackBerry應(yīng)用集成,這是一個(gè)很好的方法。同時(shí),這也是對(duì)老的Java ME應(yīng)用和BlackBerry的新應(yīng)用遷移和同步數(shù)據(jù)的一個(gè)好辦法。既然BlackBerry開(kāi)發(fā)對(duì)Java ME提供支持,所以RMS可以被用來(lái)作為這種解決的首選。
原來(lái)的MIDP規(guī)范定義了持久的,基于記錄的存儲(chǔ)功能叫記錄管理存儲(chǔ)(RMS)。一個(gè)MIDlet套件可以使用RMS創(chuàng)建一個(gè)或多個(gè)記錄存儲(chǔ),每個(gè)由一個(gè)獨(dú)一無(wú)二的名字標(biāo)識(shí)。在javax.microedition.rms包中可以找到必要的類和接口。Record Store提供了打開(kāi),關(guān)閉,讀取,寫(xiě)入和更新操作,也提供方法刪除單個(gè)記錄或者整個(gè)存儲(chǔ)。這個(gè)包包含接口來(lái)列舉,排序和篩選RMS內(nèi)容。
在MIDP1.0時(shí)候,每個(gè)RMS存儲(chǔ)只屬于創(chuàng)建它的MIDlet套件。MIDP2.0規(guī)范給RMS包增加了一個(gè)非常有用的能力:它允許一個(gè)MIDlet套件和另一個(gè)MIDlet套件共享記錄存儲(chǔ)。
如何共享
共享一個(gè)RMS記錄存儲(chǔ)需要兩個(gè)或者多個(gè)參與者:一個(gè)擁有者和一個(gè)或者多個(gè)消費(fèi)者。擁有者負(fù)責(zé)創(chuàng)建和命名存儲(chǔ)和建立授權(quán)模式-共享或者不共享-和它的訪問(wèn)模式-可寫(xiě)或者不可寫(xiě)。消費(fèi)者通過(guò)名字獲得記錄存儲(chǔ)的訪問(wèn)。消費(fèi)者不能訪問(wèn)沒(méi)有共享的存儲(chǔ),也不能修改不可寫(xiě)的存儲(chǔ)。一個(gè)共享的RMS被一個(gè)三元組標(biāo)識(shí)(提供者名字,MIDlet套件名字,記錄存儲(chǔ)名字):
◆提供者名字是JAD或者manifest文件里面的MIDlet-Vendor屬性的值。
◆MIDlet套件名字是JAD文件里面MIDlet-name字段的值
◆記錄存儲(chǔ)名字是一個(gè)1到32位長(zhǎng)的區(qū)分大小寫(xiě)的Unicode字符串,是當(dāng)你創(chuàng)建記錄存儲(chǔ)時(shí)候用的名字。
要支持共享,MIDP2.0標(biāo)準(zhǔn)在javax.microedition.rms中添加了兩個(gè)字段和三個(gè)方法第一個(gè)新方法打開(kāi)一個(gè)已經(jīng)存在的記錄存儲(chǔ),或者創(chuàng)建一個(gè)新的記錄存儲(chǔ)并設(shè)置它的授權(quán)和可寫(xiě)特性。
- static Record Store
- Open Record Store(Stringrecord Store Name,booleancreate,intauthmode,booleanwritable);
參數(shù)如下:
record Store Name設(shè)置記錄存儲(chǔ)的名字sets th ename of there cord store.create,如果為true,創(chuàng)建并不存在的存儲(chǔ).
authmode指定授權(quán)模式specifies the authorization mode:Record Store.AUTHMODE_PRIVATE阻止共享or Record Store.AUTHMODE_ANY允許共享.如果存儲(chǔ)已經(jīng)存在這個(gè)參數(shù)會(huì)被忽略.
writeable,如果為true,指定其他MIDlet套件可以修改這個(gè)記錄存儲(chǔ).如果存儲(chǔ)已經(jīng)存在這個(gè)參數(shù)會(huì)被忽略.
消費(fèi)者打開(kāi)一個(gè)共享的記錄存儲(chǔ)的方法如下:這里:
◆recordStoreName是要打開(kāi)的共享記錄存儲(chǔ)的名字
◆vendorName是擁有者M(jìn)IDlet套件的MIDlet-Vendor屬性的值
◆suiteName是擁有者M(jìn)IDlet套件的名字
僅當(dāng)記錄存儲(chǔ)的擁有者設(shè)置了automode為AUTHMODE_ANY時(shí)這個(gè)方法才能成功打開(kāi)記錄存儲(chǔ)。需要注意的是你不能直接檢測(cè)存儲(chǔ)的可寫(xiě)屬性。要發(fā)現(xiàn)一個(gè)記錄存儲(chǔ)是否可寫(xiě)的唯一方法是試著向記錄存儲(chǔ)寫(xiě)入,如果不可寫(xiě)就捕獲相應(yīng)的異常。
記住在JAD或者manifestMIDlet-Version,并不在參數(shù)列表中。這意味著擁有者套件無(wú)法在影響消費(fèi)者的前提下改變共享的存儲(chǔ)的記錄格式。
最后一個(gè)新方法如下:
- vo id
- s et Mo d e ( in t au th m o d e, b oo le an w rit ab le ) ;
這里:
authmode指定記錄存儲(chǔ)的新的授權(quán)模式specifiesthenewauthorizationmodeofthe,
AUTHMODE_PRIVATE或者AUTHMODE_ANY.
writable指定存儲(chǔ)的信息可寫(xiě)模式specifiesthestore'snewwritablemode.
只有擁有者M(jìn)IDlet套件才能改變authmode和writable屬性.沒(méi)有方法能夠用來(lái)查詢這些設(shè)置
總結(jié):
在原有老的MIDlet應(yīng)用中創(chuàng)建使用了RMS之后,在BlackBerry中直接打開(kāi)就可以操作了,反過(guò)來(lái)也是。
使用全局事件來(lái)進(jìn)行應(yīng)用交互
BlackBerry平臺(tái)提供了事件模型,用來(lái)在不同的應(yīng)用之間通信,在使用事件模型的時(shí)候需要注意如下事項(xiàng):
◆任何應(yīng)用程序都可以發(fā)布或者監(jiān)聽(tīng)全局事件
◆通過(guò)響應(yīng)全局事件可以在一個(gè)應(yīng)用程序中執(zhí)行一些本來(lái)應(yīng)該在另一個(gè)應(yīng)用中出現(xiàn)的動(dòng)作
◆通過(guò)發(fā)送全局事件也可以在應(yīng)用程序之間傳遞數(shù)據(jù)
定義全局事件
對(duì)于全局事件的定義,BlackBerry有自己的定義規(guī)范:
◆定義一個(gè)ID變量
◆把ID變量定義為靜態(tài)的,從而使得其他的類也可以引用到
◆通對(duì)包名做HASH產(chǎn)生ID,使ID變得獨(dú)一無(wú)二
示例代碼如下
- class Glo b al Ev entFi ring Ap p e xt end s UiApp li catio n {
- / / ID w il l be hash o f pac kage na m e
- pub li c stati c lo n g GLOB AL_ID = 0 xba4b 8 4 9 4 4 bb 74 29 e L ;
發(fā)布一個(gè)全局事件
通過(guò)把事件ID傳遞到postGlobalEvent()方法中,我們可以發(fā)布一個(gè)全局事件
BlackBerry提供了有四種不同的方法來(lái)發(fā)布發(fā)布一個(gè)事件示例代碼如下
- / / p o st t h e gl o b al ev en fr o m y o u r app li cati o n aft er s o m et h in g
- / / m eaning fu l ha s happ e n ed
- App li ca tio n M an ag er.g et App li catio n M an ag e r()
- .p o stGl o b alEv ent(G L OBAL_ ID) ;
- / /o r a po st p assin g o the r in fo r m ati o n
- App li ca tio n M an ag er.g et App li catio n m an ag er()
- .p o stG o lb alEv ent(G L OBAL_ ID,data0 ,d ata1 ,o b j ect 0 ,o b j ect 1 );
對(duì)于事件接受者來(lái)說(shuō),需要考慮和實(shí)現(xiàn)的關(guān)鍵點(diǎn)如下
◆全局監(jiān)聽(tīng)?wèi)?yīng)用程序必須要是一個(gè)自動(dòng)啟動(dòng)應(yīng)用程序
◆監(jiān)聽(tīng)程序需要有類能夠?qū)崿F(xiàn)一個(gè)GlobalEventListener接口
◆監(jiān)聽(tīng)程序需要添加GlobalEventListener實(shí)例
示例代碼如下:
- class Gl o b alEv entL is te n erA p p e xt end s UiApp li catio n i m p le m ents Glob alE ve n tL i ste n e r {
- …
- pub li c Glob alEv entL i ste n er App () {
- add Glob alE v en tL ist ener(t h is);
對(duì)于GlobalEventListener接口,來(lái)說(shuō)應(yīng)用需要注意的是,必須要實(shí)現(xiàn)具體事件影響的方法,示例代碼如下:
GlobalEventListener接口只有一個(gè)必須要實(shí)現(xiàn)的方法不管事件怎么發(fā)布的,這個(gè)方法都是一樣的
- // thi s m et h o d is ex ecu te d when a gl o b al e v ent has be en po st ed pub li c vo id ev entOc cur ed(l o n g gu id , int data 0 , int da t 1 ,
- Object o b je ct0 , Ob je ct o b je ct1 ) {
- / / che ck the I D o f t h e po st in g app
- if (gu id = = Gl o b alE v entFi ri ng App .GLOBAL_ ID ) {
- / / d o som et h in g m eaning fu l here
- / / v ari ab les that w ere passed in can b e u sed d epen d in g
- / /o n w h at po st o ccurr e d . O ther wise the v alu e will be nu ll
- }
- }
使用RUNTIMEStore來(lái)應(yīng)用交互
相對(duì)于靜態(tài)的RMS的繁瑣配置和不靈活,BlackBerry提供的運(yùn)行時(shí)存儲(chǔ)(runtimestore)非常靈活和方便,它在平臺(tái)即被提供了如下功能。
◆運(yùn)行時(shí)存儲(chǔ)提供一個(gè)中間區(qū)域讓不用應(yīng)用可以共享對(duì)象
◆通過(guò)數(shù)字簽名的任何應(yīng)用程序都可以訪問(wèn)運(yùn)行時(shí)存儲(chǔ)
對(duì)于運(yùn)行時(shí)存儲(chǔ)–存儲(chǔ)數(shù)據(jù)的使用需要注意的是:
◆對(duì)象可以添加到運(yùn)行時(shí)存儲(chǔ)或者從運(yùn)行時(shí)存儲(chǔ)中替換掉
◆運(yùn)行時(shí)存儲(chǔ)必須以一個(gè)獨(dú)一無(wú)二的ID創(chuàng)建
◆任何類型的對(duì)象都可以放到運(yùn)行時(shí)存儲(chǔ)中
這里是創(chuàng)建運(yùn)行時(shí)存儲(chǔ)和寫(xiě)入簡(jiǎn)單數(shù)據(jù)的代碼示例
- class Crea te St o re D e m o e xt end s UiApp li catio n {
- / / cr eate t h e ID bas ed o n p ackage na m e
- pub li c sta tic l o n g STOR E_I D = 0 x 23 ad 2 3 4 8 9 a 2 4 3 L ;
- pub li c Crea te St o re D e m o ( ) {
- Strin g m sg = “ Sh ared te xt f o r ano ther app li ca tio n ” ; Run ti m eSt o re st o re = R un tim eSt o re.g e tRun ti m eSt o re() ; try {
- st o re.pu t(ST ORE_ I D , m sg );
- } ca tch (E xce p tio n ex ) {}
- }
- }
創(chuàng)建好了以后,這里就是讀取運(yùn)行時(shí)候存儲(chǔ)的代碼示例
- class Re ad Sto r eD em o ex te nd s UiApp li catio n {
- pub li c ReadS t o r eD em o () {
- Run ti m eSt o re st o re = R un tim eSt o re.g e tRun ti m eSt o re() ;
- try {
- / / cast t h e return ed o b ject to a st rin g
- S trin g m sg = ( S tring )st o re.g et (Crea te St o re D e m o . STORE_ I D ) ;
- } ca tch (E xce p tio n ex ) {
- / / h and le e xce p ti o n
- }
- }
- }