BlackBerry應(yīng)用和MIDlet之間的交互
在前文中我們給大家介紹了如何將MIDlet應(yīng)用移植到BlackBerry,本文我們將介紹《BlackBerry應(yīng)用和MIDlet之間的交互》。
用RMS在MIDlet和BlackBerry之間共享數(shù)據(jù)
對于很多沒有BlackBerry應(yīng)用經(jīng)驗的開發(fā)者,或者對于很多現(xiàn)有的Java ME的系統(tǒng),如果以最小的代價和BlackBerry應(yīng)用交互,或者和BlackBerry應(yīng)用集成,這是一個很好的方法。同時,這也是對老的Java ME應(yīng)用和BlackBerry的新應(yīng)用遷移和同步數(shù)據(jù)的一個好辦法。既然BlackBerry開發(fā)對Java ME提供支持,所以RMS可以被用來作為這種解決的首選。
原來的MIDP規(guī)范定義了持久的,基于記錄的存儲功能叫記錄管理存儲(RMS)。一個MIDlet套件可以使用RMS創(chuàng)建一個或多個記錄存儲,每個由一個獨(dú)一無二的名字標(biāo)識。在javax.microedition.rms包中可以找到必要的類和接口。Record Store提供了打開,關(guān)閉,讀取,寫入和更新操作,也提供方法刪除單個記錄或者整個存儲。這個包包含接口來列舉,排序和篩選RMS內(nèi)容。
在MIDP1.0時候,每個RMS存儲只屬于創(chuàng)建它的MIDlet套件。MIDP2.0規(guī)范給RMS包增加了一個非常有用的能力:它允許一個MIDlet套件和另一個MIDlet套件共享記錄存儲。
如何共享
共享一個RMS記錄存儲需要兩個或者多個參與者:一個擁有者和一個或者多個消費(fèi)者。擁有者負(fù)責(zé)創(chuàng)建和命名存儲和建立授權(quán)模式-共享或者不共享-和它的訪問模式-可寫或者不可寫。消費(fèi)者通過名字獲得記錄存儲的訪問。消費(fèi)者不能訪問沒有共享的存儲,也不能修改不可寫的存儲。一個共享的RMS被一個三元組標(biāo)識(提供者名字,MIDlet套件名字,記錄存儲名字):
◆提供者名字是JAD或者manifest文件里面的MIDlet-Vendor屬性的值。
◆MIDlet套件名字是JAD文件里面MIDlet-name字段的值
◆記錄存儲名字是一個1到32位長的區(qū)分大小寫的Unicode字符串,是當(dāng)你創(chuàng)建記錄存儲時候用的名字。
要支持共享,MIDP2.0標(biāo)準(zhǔn)在javax.microedition.rms中添加了兩個字段和三個方法第一個新方法打開一個已經(jīng)存在的記錄存儲,或者創(chuàng)建一個新的記錄存儲并設(shè)置它的授權(quán)和可寫特性。
- static Record Store
- Open Record Store(Stringrecord Store Name,booleancreate,intauthmode,booleanwritable);
參數(shù)如下:
record Store Name設(shè)置記錄存儲的名字sets th ename of there cord store.create,如果為true,創(chuàng)建并不存在的存儲.
authmode指定授權(quán)模式specifies the authorization mode:Record Store.AUTHMODE_PRIVATE阻止共享or Record Store.AUTHMODE_ANY允許共享.如果存儲已經(jīng)存在這個參數(shù)會被忽略.
writeable,如果為true,指定其他MIDlet套件可以修改這個記錄存儲.如果存儲已經(jīng)存在這個參數(shù)會被忽略.
消費(fèi)者打開一個共享的記錄存儲的方法如下:這里:
◆recordStoreName是要打開的共享記錄存儲的名字
◆vendorName是擁有者M(jìn)IDlet套件的MIDlet-Vendor屬性的值
◆suiteName是擁有者M(jìn)IDlet套件的名字
僅當(dāng)記錄存儲的擁有者設(shè)置了automode為AUTHMODE_ANY時這個方法才能成功打開記錄存儲。需要注意的是你不能直接檢測存儲的可寫屬性。要發(fā)現(xiàn)一個記錄存儲是否可寫的唯一方法是試著向記錄存儲寫入,如果不可寫就捕獲相應(yīng)的異常。
記住在JAD或者manifestMIDlet-Version,并不在參數(shù)列表中。這意味著擁有者套件無法在影響消費(fèi)者的前提下改變共享的存儲的記錄格式。
最后一個新方法如下:
- vo id
- s et Mo d e ( in t au th m o d e, b oo le an w rit ab le ) ;
這里:
authmode指定記錄存儲的新的授權(quán)模式specifiesthenewauthorizationmodeofthe,
AUTHMODE_PRIVATE或者AUTHMODE_ANY.
writable指定存儲的信息可寫模式specifiesthestore'snewwritablemode.
只有擁有者M(jìn)IDlet套件才能改變authmode和writable屬性.沒有方法能夠用來查詢這些設(shè)置
總結(jié):
在原有老的MIDlet應(yīng)用中創(chuàng)建使用了RMS之后,在BlackBerry中直接打開就可以操作了,反過來也是。
使用全局事件來進(jìn)行應(yīng)用交互
BlackBerry平臺提供了事件模型,用來在不同的應(yīng)用之間通信,在使用事件模型的時候需要注意如下事項:
◆任何應(yīng)用程序都可以發(fā)布或者監(jiān)聽全局事件
◆通過響應(yīng)全局事件可以在一個應(yīng)用程序中執(zhí)行一些本來應(yīng)該在另一個應(yīng)用中出現(xiàn)的動作
◆通過發(fā)送全局事件也可以在應(yīng)用程序之間傳遞數(shù)據(jù)
定義全局事件
對于全局事件的定義,BlackBerry有自己的定義規(guī)范:
◆定義一個ID變量
◆把ID變量定義為靜態(tài)的,從而使得其他的類也可以引用到
◆通對包名做HASH產(chǎn)生ID,使ID變得獨(dú)一無二
示例代碼如下
- 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ā)布一個全局事件
通過把事件ID傳遞到postGlobalEvent()方法中,我們可以發(fā)布一個全局事件
BlackBerry提供了有四種不同的方法來發(fā)布發(fā)布一個事件示例代碼如下
- / / 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 );
對于事件接受者來說,需要考慮和實現(xiàn)的關(guān)鍵點(diǎn)如下
◆全局監(jiān)聽?wèi)?yīng)用程序必須要是一個自動啟動應(yīng)用程序
◆監(jiān)聽程序需要有類能夠?qū)崿F(xiàn)一個GlobalEventListener接口
◆監(jiān)聽程序需要添加GlobalEventListener實例
示例代碼如下:
- 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);
對于GlobalEventListener接口,來說應(yīng)用需要注意的是,必須要實現(xiàn)具體事件影響的方法,示例代碼如下:
GlobalEventListener接口只有一個必須要實現(xiàn)的方法不管事件怎么發(fā)布的,這個方法都是一樣的
- // 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來應(yīng)用交互
相對于靜態(tài)的RMS的繁瑣配置和不靈活,BlackBerry提供的運(yùn)行時存儲(runtimestore)非常靈活和方便,它在平臺即被提供了如下功能。
◆運(yùn)行時存儲提供一個中間區(qū)域讓不用應(yīng)用可以共享對象
◆通過數(shù)字簽名的任何應(yīng)用程序都可以訪問運(yùn)行時存儲
對于運(yùn)行時存儲–存儲數(shù)據(jù)的使用需要注意的是:
◆對象可以添加到運(yùn)行時存儲或者從運(yùn)行時存儲中替換掉
◆運(yùn)行時存儲必須以一個獨(dú)一無二的ID創(chuàng)建
◆任何類型的對象都可以放到運(yùn)行時存儲中
這里是創(chuàng)建運(yù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)行時候存儲的代碼示例
- 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
- }
- }
- }