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