作者: 王志刚
一 用 RM S 在 M I Dl e t 和 B l ac kB er ry 之间共享数据
对于很多 没有 Bla c kBerr y 应用经验 的开发 者,或者 对于很多 现有的 J 2M E 的 系统,如 果以最 小的代 价和 Bla ck Berr y 应用交互 ,或者和 Bla ckB erry 应用 集成,这 是一个 很好的方 法。同时 ,这也 是对
老的 J 2 M E 应用 和 Bla c kBe rry 的新应 用迁移 和同步 数据的一 个好办 法。既 然 Bla ckB erry 开发对
J 2M E 提 供支持 ,所以 RM S 可以被用来 作为这 种解 决的首选 。
原来的 M ID P 规范 定义了 持久的, 基于记 录的存储 功能叫记 录管理 存储 (R M S ) 。一个 M IDl et 套 件可 以使用 R M S 创建 一个或 多个记录 存储, 每个由一 个独一无 二的名 字标识 。 在
jav ax. m icr o edi ti o n .r m s 包 中可以找 到必要 的类和接 口。 Rec o rd St o re 提供了 打开,关 闭,读 取,写 入和更新 操作, 也提供方 法删除单 个记录 或者整个 存储。这 个包包 含接口来 列举,排 序和筛 选
RM S 内容 。
在 M I D P 1 .0 时 候,每 个 R M S 存储只 属于创 建它的 M IDle t 套件 。 M I D P 2 .0 规 范给 R M S 包增加 了一 个非常有 用的能 力:它允 许一个 M IDl et 套件 和另 一个 M I D let 套件共 享记 录存储。
如何共享
共享一个 RM S 记 录存储 需要两个 或者多 个参与者 :一个拥 有者和 一个或者 多个消费 者。拥 有者负 责创建和 命名存 储和建立 授权模式 - 共享或 者不共 享 - 和它的 访问模 式 - 可写 或者不可 写。消 费者 通 过名字获 得记录 存储的访 问 。消费 者不能 访问没有 共享的存 储,也 不能修改 不可写的 存储。 一个共享 的 R M S 被一个 三元组标 识 ( 提供 者名字 , M IDl et 套 件名字 ,记录 存储名字 ) :
→ 提供者 名字是 J A D 或 者 m an ife st 文件 里面 的 M IDle t -Vend o r 属性的值 。
→ M IDl et 套 件名字 是 JA D 文件 里面 M IDle t -n am e 字段的值
→ 记录存 储名字 是一个 1 到 3 2 位长 的区分 大小写 的 Un ico d e 字符串 ,是当 你创建记 录存储 时候用 的名字。
要支持共 享, M ID P2 . 0 标 准在 jav ax.m i cro edi tio n .r m s 中添 加了两 个字段和 三个方法 第一个新 方法打 开一个已 经存在的 记录存 储,或者 创建一个 新的记 录存储并 设置它的 授权和 可写 特性。
s tatic Rec o rd St o re
Op enRec o rd St o re (Strin g rec o rd Sto r eNam e, b oo l ea n creat e, in t au th m o d e, b oo le an writ ab le);
参数如下 :
reco rd St o reN a m e 设置记 录存储的 名字 s et s the na m e o f the r ecor d st o re. create , 如果 为 true ,创建 并不存在 的存储 .
au thmo d e 指 定授权 模式 s p ecifies the auth o riz atio n mo d e: Rec o rd St o re.A UTH M O D E_ P RIV ATE 阻止 共
享 o r Re c o rd St o re.A U THM OD E_AN Y 允 许共享 . 如果 存储已经 存在这 个参数会 被忽略 .
writeab le , 如果 为 true , 指 定其他 M IDl et 套件 可以 修改这个 记录存 储 . 如果 存储已经 存在这 个参数 会 被忽略 .
消费者打 开一个 共享的记 录存储的 方法如 下: 这里:
· reco rd St o reN a m e 是要打 开的共享 记录存 储的名 字
· v end o rN am e 是拥 有者 M I D let 套 件的 M IDl et -Ven d o r 属性的值
· sui te N am e 是拥 有者 M IDl et 套件 的名字
仅当记录 存储的 拥有者设 置了 au t o m o d e 为 AU TH M OD E_AN Y 时这个 方法才 能成功打 开记录 存储。 需要注意 的是你 不能直接 检测存储 的可写 属性。要 发现一个 记录存 储是否可 写的唯一 方法是 试着 向记录存 储写入 ,如果不 可写就捕 获相应 的异常 。
记住在 JA D 或者 m an ifest M IDle t -Versi o n ,并 不在 参数列表 中。这 意味着拥 有者套件 无法在 影响消 费者的前 提下改 变共享的 存储的记 录格式 。
最后一个 新方法 如下:
vo id
s et Mo d e ( in t au th m o d e, b oo le an w rit ab le ) ;
这里 :
au thmo d e 指 定记录 存储 的新的授 权模式 specifi es the n ew autho riz atio n m o d e o f t h e ,
AU THMO D E_ P RIV AT E 或 者 AU THM OD E _AN Y.
writabl e 指定存 储的信息 可写模式 specifi es t h e st o r e's new w ritab l e mo d e.
只有拥有 者 M I D let 套件 才能改变 au thm o d e 和 wr itab le 属性 . 没有 方法能够 用来查询 这些设 置
总结:
在原有老 的 M I D let 应用 中创建使 用了 R M S 之后 ,在 Bla ck Berr y 中直接打 开就可以 操作了 ,反过 来 也是。
二 使用全局事件来 进 行应用 交互
Bla ckBe rr y 平台 提供了事 件模型, 用来在 不同的应 用之间通 信,在 使用事件 模型的时 候需要 注意 如下事项 :
· 任何应用 程序都 可以发布 或者监听 全局事 件
· 通过响 应全局 事件可以 在一个应 用程序 中执行一 些本来应 该在另 一个应用 中出现的 动作
· 通过发送 全局事 件也可以 在应用程 序之间 传递数 据
定 义全 局事件
对于全局 事件的 定义, Bl ackBerr y 有自 己的定 义规 范 :
· 定义一个 I D 变量
· 把 ID 变量 定义为 静态的 ,从而使 得其他 的类也可 以引用到
· 通对包名 做 H AS H 产生 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 传 递到 p o s tGlo b alE v ent () 方 法中 , 我们可以 发布一 个全局事 件
Bla ckBe rr y 提供 了有四种 不同的方 法来发 布 发布一 个事件 示例代码 如下
/ / 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 );
对于事件 接受者 来说,需 要考虑和 实现的 关键点如 下
· 全局监听 应用程 序必须要 是一个自 动启动 应用程 序
· 监听程序 需要有 类能够实 现一个 Gl o b alE v ent L isten e r 接口
· 监听程序 需要添 加 Glob al Ev ent L ist ener 实例
示例代码如下:
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);
对于 Gl o b alEv entL is te n er 接口,来 说应用 需要注意 的是,必 须要实 现具体事 件影响的 方法, 示例 代码如下 :
Glob alE v entL i ste n e r 接口 只有一个 必须要 实现的方 法 不管事件 怎么发 布的,这 个方法都 是一样 的
// 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
}
}
三 使 用 R UNT IM E S t or e 来应用交互
相对于静 态的 R M S 的繁 琐配置和 不灵活 , Bla ckB erry 提 供的运 行时存 储( run tim e sto re ) 非常灵 活和方便 ,它在 平台即被 提供了如 下功能 。
· 运行时存 储提供 一个中间 区域让不 用应用 可以共享 对象
· 通过数字 签名的 任何应用 程序都可 以访问 运行时存 储
对于运行 时存储 – 存储数 据 的使 用需要 注意的是 :
· 对象可以 添加到 运行时存 储或者从 运行时 存储中替 换掉
· 运行时存 储必须 以一个独 一无二的 I D 创建
· 任何类型 的对象 都可以放 到运行时 存储中
这里是创 建运行 时存储和 写入简单 数据的 代码示 例
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
}
}
}
BlackBerry SDK下载