作者: 邓明轩、王恒进、王志刚
通过应用图标 提醒用 户
除了使 用主 屏幕 标记 以后 , 开发 人员 还可 以使 用改 变应用 图标 的方 式提 醒用 户。 假 如下 图为正 常的 应用 图标 :
开发人 员可 以通 过 AP I 修 改图标 ,提 示用 户该 应用 有新的 事件 发生 ,如 下图 :
修改应 用图 标相 对比 较简 单, 只需 要调 用 n et .rim .b la ck berry .a pi .ho m e s cr ee n. Ho m eSc re en
的静态方 法 up da t eIc o n 就 可以更 改本 应用 的图 标, 参数为一 个 Bitm ap 图 片。 下面是 修改 应用 图标 的代 码片段 :
Bitmap icon=Bitmap. getBitmapResource ( " cn/searb/test/unread.gif" );
net.rim.blackberry.api.homescreen.HomeScreen. updateIcon (icon);
网络连接调整
Bla ck Be rr y 接 口使 用 j2 m e 标准的 方法实 现 Ht t p 连接 或者 是 So ck et 连接 , 在 MI Dl et 中的 网络连 接程 序可 以不 加修 改地 在 Bla ck Be rry 平台上 运行 。 然而 , 因 为 Bla ck Ber ry 提 供更 多的 网络连 接选择 , 开发 人员 可以对 网络 连接 代码 进行 调整 , 使 用应 用的网 络连 接更加 稳定 , 更 加符合 用户 的网 络选 择。
因为 Bla ck B er r y 需 要支持 标准 的 j2 m e ,所 以还 是通 过 ja v a x.m ic r o e dit io n. io . Co nn ect o r 类 实现各 种连 接。 为了 提供 更多的 网络 选择 , Bla c kBer ry 平台 在 Co nn ect o r 的 o p en 方 法中 对 U RL 进行 了特 殊处 理,开 发人员 可以 在 U RL 后面加 上一些 特殊 的参 数以 标明 不同的 网络 连 接。比 如, 下面 的语 句在 U RL 后面 加上 了“ d ev ic e s id e= f als e ” ,表 明程 序希 望通 过 BE S MD S 连接网 络: Co nn ect o r .o pe n(“ h t t p://w ww .m y s er v er .co m ; d ev ic e s id e= f als e”) ;
需要了 解不 同参 数的 详细 情况, 可以参 考 AP I 文档 中 ja v a x.m ic r o e dit io n. io . Co nn ect o r 类 的说明 。
下面我 们根 据不 同的 链路 从整体 上简 单介 绍 Bla c kBe rry 上的 不同 连接 方式 。
B l ac kB erry En t e rprise S e rv er(B ES) 方式
这种方 式通 过使 用 BE S 的 Bla c kBe rry MDS S e r vic e s 来进 行网 络连 接, Bla ck B er ry MD S S er vic e s 负责 处理 所有 的浏 览器请 求或 者连 接请 求、 并负责 数据 加密 ,这 是黑 莓手机 的默 认 连接方 式, 如下 :
( Ht t pCo nn ect io n) Co nn ect o r . o pen("h t t p://www . t e s t s er ve r .c o m" ) ;
以上代 码会 自动 将 Bla c kBe rry MD S S e rvice s 作 为它的 默认连 接路 径。 实际 开发 中,如 果 要确保 应用 程序使 用 us e s B la ck Be rry MDS S e r vic e s 作 为它的 连接 路径 , 需要 在 U RL 最 后加 上 参数“ de vice s id e= f alse ” , 这也是 我们 推荐 的方 式, 如下:
( Ht t pCo nn ect io n) Co nn ect o r . o pen(“ h t t p:/ /www . t e s t s er v e r .c om ; de vice s id e= f alse ”) ;
B l ac kB erry Int er ne t S erv ie 方式
这种方 式是 为第 三方 提供 的连接 接口 , 它对 数据不 进行加密 , 用 户可 以通过 使用 HT TP S
和 SS L 来 进行 安全的 连接 。 注 : 目 前仅 对加 入了 Bla ck Be rry All ia nc e P r og r am 的 第三方 开放 合 作伙伴 开放 ,详 情参 考: h t t p://na .b la ck be rry .c om / eng /p art ne r s / al li an ce.js p 。
Di r ect T CP 方式
这种方 式允 许在 没有 使用 B la ck Be rry M DS 的黑莓 手机 上直接 T CP 连接。 为了 能启 用 di r ec t T CP 方式, 用户 需要 在手机 的 “选 项 - 高 级选 项 -T CP /IP ” 中设 置 AP N , 以及 相应 的用户 名和 密 码。
运行 在 iD E N 网 络上 的黑莓 手机 ( 包括 6 5 1 0 、 7 51 0 、 7 5 2 0 和 7 10 0 i ), 如 果不指 定 d e vice s id e 参数, 默认 的连 接是 di r ect T CP ; 非 运行在 iD EN 网络上 的其他 黑莓 手机 , 如 果不指 定 de vice s id e 参数, 默认 的连接 是 Bla ck Berr y MDS 。
如果连接 时 Bla ck Be rry M D S 不存在 ,黑 莓手 机也会 自动采 用 di r ect T CP 方式 。 因此 , 如果 要 将 di r ect T C P 作 为黑莓 手 机的默认连接方 式 ,我们建 议 在 U R L 中 加 入
“ de vice s id e=t ru e ” 参数, 如下:
( St re am Co nn ect io n)Con n ect o r .o pen("so ck et : //t e s t s er v er : 60 0; d e vice s id e =t ru e") ;
W i -Fi
如果需要 在 W i -F i 上创建 网络连 接, 不需 要在 应用 程序中 考虑 特别 的底 层逻 辑, 可 以在
U RL 中 加入 参数 “ in t er f ac e =wifi ” 就能实 现 W i -F i 连接 ,如下 :
( St re am Co nn ect io n)Con nect o r .o pen(“ so ck et : / / t e s t s er v e r: 6 00 ; in t er f ac e =wi fi ”) ;
W AP 1.x
并不是 所有 的移 动运 营商 都支持通 过 W AP 网关 进行 连接的 , 所 以如 果要 创建 W AP 连接 ,
开发者 需要 和移 动运 营商 联系, 获取 是否 提供 这种 支持、 并且 获取 他们 的 W A P 网管参 数。 以下是 一个基 于 W AP 网关 进行 HT TP 连接 的例子 :
( Ht t pCo nn ect io n) Co nn ect o r . o pen("h t t p://w ap . g oog le.c om ; W AP G a t ew a yIP = 1 2 7 . 0 .0. 1 ; W AP G a t e w a yAP N= c ar rie r .c om . g pr s" ) ;
其中 W AP G a t ew a yIP 和 W A P G a t ew a yAP N 这两 项参数 必须指 定, 参数 之间 用“ ; ”隔开 ,
以下是 所有 的 W AP 参数列 表, 实 际开 发时 请根 据运营 商提供 的信 息决 定哪 些参 数需要 设置 。
参数 |
描述 |
W apGa t eway I P |
网关地址 |
W apGa t ewayAP N |
AP N 的名称 |
W apGa t ewayPo r t |
网关端口号, 如果使用端口 号 920 3 的话, 会自动启用 “ W i r e le s s T r an s po r t La y e r Se c u r it y ” ( W TLS ) , 除 非 指 定 了 W apE n ab l e WT LS= f a ls e 参数。 |
W apSou rc e I P |
W a p 服 务器的地址。 |
W apSou rc ePo r t |
W a p 服 务器的端口号 。 |
T u n ne lA u t hU s e r na me |
AP N 的用户名,当网关启 用 Pa ss wo r d Au t hen t ic a t io n P r o t o c o l ( P AP ) 或 者 是 Cha lleng e H an d s ha k e A p p lic a t io n P r o t o c o l ( CHAP ) 时才需要提 供。 |
T u n ne lA u t hPa ss wo r d |
AP N 密码,当网关启用 P A P 或 者是 CHA P 时才需要提 供。 |
W apEnab le W TL S |
指定是否启用 W TL S , 如果没有 指定该参数, 当端 口号为 9203 时会自动应用 W TL S 。 |
W AP 2.0
如果手 机上 的 S e r vic e Boo k 上有 W AP 2 . 0 的 网关 记录 , 可以通 过 AP N= <AP N Nam e > 的方法 指定网 关, 系统会 从 S er vic e Boo k 上找 到对 应的 信息 连接网 关。 不过 ,对 于不 同的运 营商 , W AP 2 . 0 网 关的 名称 是不同 的, 如 果在 程序 里通 过网 关名称 指定 所需 要连 接的 网关, 则有 可 能在不同的 运营商环境 中出现连接问 题。有一个 相对通用的做 法是通过程 序遍历手机 上的 S er vic e Boo k , 找 到 W AP 2 . 0 的 网关 记录 , 然 后通 过该 记录 的 U ID 进 行连 接, 因为 在 Bla ck Be rry 上可以 在 RU L 后 面加 上 Co nn ect io nU ID =< G a t ew a yU ID> 的方式 指定 网关 。
具 体 的 做 法 是 先 通 过 S e r vic eBoo k 类 的 g et S B 方 法 获 得 S er vice Boo k , 然 后 通 过 S er vic eBoo k 实例 的 fin dR ec o r ds B yCi d 方 法查 找在 Cid 中带“ WP T CP ”字 样的记 录。这 些记 录 里可能包 含 W ifi 或者 是 m m s 对应的 记录 , 所 以要排 除这些 记录 , 使 用的 方法 是判断 在 U id , 查找 U id 里不 带“ W i fi ”和 “ mms ”字 样的 记录 。
代码片 段如 下:
ServiceBook sb = ServiceBook. getSB ();
ServiceRecord[] records = sb.findRecordsByCid( "WPTCP" ); String uid = null ;
for ( int i = 0; i < records. length ; i++) {
if (records[i].isValid() && !records[i].isDisabled()) {
if (records[i].getUid() != null
&& records[i].getUid().length() != 0) {
if ((records[i].getUid().toLowerCase().indexOf( "wifi" ) == -1)
&& (records[i].getUid().toLowerCase()
.indexOf( "mms" ) == -1)) {
uid = records[i].getUid();
break ;
}
}
}
}
if (uid != null ) {
// 在参数中指 定 Co nn ec t io nU ID
Connector.open (_url + ";ConnectionUID=" + uid);
} else {
// 没找到 Wap 2.0 的 se r vi ce bo ok , 做其它处 理 .
}
数据存储与共享
使 用 RM S 进行 存 储
j2 m e 提供 了 R MS 存储机 制, MI DP 规范 定义 了持久 的、基 于记 录的 存储 功能 ,叫记 录 管理存 储 ( RMS) 。一 个 MI D let 套 件可 以使 用 R MS 创 建一个 或多 个记 录存 储, 每个 记 录由一 个唯一 的名 字标 识。 在 j a v a x.m ic r o e dit io n. rm s 包中可 以找到 必要 的类 和接口 对 RMS 进 行操 作,其 中关 键是 的 R ec o r dSt o r e 。 R eco r dS t o r e 提供了 打开, 关闭 ,读 取, 写入 和更新 操作 , 也提供方法删除单个记录或者整个存储。这个包包含 各种接口用于列举、排序和筛选 RMS 内容。
Bla ck Be rry 平台 提供 了对标 准 j2 m e 的支 持, 所以 也支 持标准 的 RMS 存储机 制, 开发人 员在 MI Dl et 中使 用的 RMS 存储代 码可 以不 加修 改直 接在 Bla ck B er r y 上 运行 。
在 MI DP 1 . 0 时候, 每 个 RM S 存储只 属于 创建 它的 MI D let 套 件, 不能 用于不 同程 序之间 的数据 共享 。 MI DP 2 . 0 规 范给 RMS 包增 加了 一个非 常有用 的能 力: 它允 许一 个 MI Dl et 套件 和另一 个 MI Dl et 套件 共享 记录存 储。
共享一 个 RMS 记 录存 储需 要两个 或者 多个 参与 者: 一 个拥有 者和 一个 或者 多个 消费者 。 拥有者 负责创 建和命 名存 储,建 立授权 模式指 定存 诸为“ 共享” 或者“ 不共 享 ” ,同 时可 以
指定它 的访问 模式“ 可写 ”或者 “不可 写” 。 消费者 通过名 字获得 记录存 储的 访问。 消费者 不能访 问没 有共 享的 存储 ,也不 能修 改不 可写 的存 储。
一个共享 的 RMS 被一 个三 元组标 识 ( 提供 者名 字, MI Dl et 套 件名 字, 记录 存储 名字 ) :
l 提供者 名字 是 J AD 或者 m a ni f e s t 文 件里 面的 MI Dl et - V endo r 属 性的 值。
l MI Dl et 套 件名字 是 J AD 文 件里 面 MI Dl et -nam e 字段 的值
l 记录存 储名 字是一 个 1 到 3 2 位 长的 区分 大小写 的 U ni c o de 字符 串, 是当 你创 建记 录存储 时候 用的 名字 。
为了支 持共 享, MI DP 2 . 0 标准 在 ja v a x.m ic r o e dit io n. r m s 中添一 些方 法: 第一个 方法 用于 打开 一个 已经存 在的 记录 存储 , 或者 创建一 个新 的记 录存 储并 设置它 的
授权和 可写 特性 。
s t a t ic R ec o r dS t o r e Op enR ec o r dS t o r e ( St rin g r ec o r d S t o r eN am e , boo le an c re a t e, i n t aut hmo de, boo le an w rit ab le ) ;
参数说 明如下 :
l r ec o r dS t o r eN am e 设置记 录存储 的名 字
l cre a t e , 是否 强制 创建 ,如 果为 t ru e , 存储 不存 在时 会强制 创建
l aut hmo de , 用 于 指 定授权 模式 : 使 用 R eco r dS t o r e.A U TH MO D E_P RI V A TE 话 表示 不允 许共享 , 使用 R ec o r dS t o r e . A U T HMO D E_A NY 则允许 共享 , 如 果存 储已 经存在 这个 参数会 被忽 略。
l wr it e ab le ,是 否可 写,如 果为 t ru e, 指定 其他 MI Dl e t 套件可 以修 改这 个记 录存 储, 如果存 储已 经存 在这 个参 数会被 忽略 。
第二个 方法 用于 打开 共享 记录存 储:
s t a t ic R ec o r dS t o r e o penR ec o r dS t o r e( St rin g r ec o r dS t o r eN am e, St rin g v endo r Nam e , St rin g
s ui t eN am e)
参数说 明如 下:
l r ec o r dS t o r eN am e 是 要打开 的共享 记录 存储 的名 字
l v endo r Nam e 是拥有 者 MI D let 套 件的 MI Dl et - V endo r 属性的 值
l s ui t eN am e 是拥 有者 MI Dl e t 套件的 名字
仅当记 录存 储的 拥有 者设 置了 au t omo de 为 A U TH M OD E_A NY 时 这个 方法 才能 成功打 开 记录存 储。 需要 注意 的是 你不能 直接 检测 存储 的可 写属性 。 要 发现 一个 记录 存储是 否可 写的 唯一方 法是 试着 向记 录存 储写入 ,如 果不 可写 就捕 获相应 的异 常。
记住 在 J AD 或 者 m an i f e s t M ID let -V er s io n , 并 不在 参数 列表中 。 这意 味着 拥有者 套件无 法 在影响 消费 者的 前提 下改 变共享 的存 储的 记录 格式 。
第三个 方法 用于 修改 存诸 的属性 :
V o id s et Mo de( in t aut hmo de, boo le an w rit ab le ) ;
参数说 明如 下:
l aut hmo de 指定记录存储 的新的授权模式, 可以设 置为 A U T HMO D E_P RI V A T E 或者
是 A U TH MO DE_ AN Y 。
l wr it ab le 指定 存储 的信息 是否可 写。
注意只 有存 诸的 拥有 者才 能改变 aut hmo de 和 w rit ab le 属 性。 另外 ,没 有方 法能够 用 来查询 这些 设置 。
如上所述 , Bla ck Be rry 平台 提供 j 2 m e 支持 , 所以 开发 人员可以 在 Bla ck Be rry 平 台上使 用
RMS 方 法完 成数 据的 存诸 和共享 。
使 用 R u nT imeS t or e 进行存储
相对于 静态 的 R MS 的繁琐 配置和 不灵 活, Bla ck B er r y 提供了 R un T im eS t o r ( e 运行 时存储 ) , 使用非 常灵 活和 方便 。
RunT im eSt o r e 在 平台 级别提供 了数据存储方 式和共享方 式,它提供了 一个中间区 域让 不同应 用可 以共 享对 象, 任何通 过数 字签 名的 应用 程序都 可以 访问 运行 时存 储。
对于 RunT im eSt o r e 的使用 需要注 意的 是:
l 对象可 以添 加到 运行 时存 储或者 从运 行时 存储 中替 换掉
l 运行时 存储 必须 以一 个独 一无二 的 ID 创建
l 任何类 型的 对象 都可 以放 到运行 时存 储中
l 设备掉 电的时 候 Run t im eSt o r e 中的 数据 会丢 失。 下面是 创建 运行 时存 储和 写入简 单数 据的 代码 示例 :
class CreateStoreDemo extends UiApplication {
// 通过包名 生成的 唯一的长 整型 ID
public static long STORE_ID = 0x23ad23489a243L;
public CreateStoreDemo() {
String msg = “S ha re d te xt f or a no th er a pp li ca ti on ” ; RuntimeStore st or e = RuntimeStore .getRuntimeStore(); try { store.put(S TORE_ID, msg);
} catch (Exception ex) {}
}
}
创建好 了以 后就 可以 通过 相应代 码获 取其 中的 数据 , 下面 是读 取 RunT im eSt o r e 的 代码 示例 :
class ReadStoreDemo extends UiApplication {
public ReadStoreD emo() {
RuntimeStore st ore = RuntimeStore.getRuntimeStore();
try {
//cast the r eturned object to a string
String msg = (String)store.get( CreateStoreDemo.STORE _ID);
} catch (E xc ep t io n ex ) {
//handle exc eption
}
}
}
BlackBerry SDK下载
相关链接:
如何将MIDlet 应用移植到BlackBerry (一)
如何将MIDlet 应用移植到BlackBerry (二)
如何将MIDlet 应用移植到BlackBerry (三)
如何将MIDlet 应用移植到BlackBerry (四)