如何将MIDlet应用移植到BlackBerry(四)

作者: 邓明轩、王恒进、王志刚

 

 

使 P ersist ent S t or e 进行存储

 

 

Bla ck Be rr y P er s ist en tS t o r e 数据 象直 存在 使 用的 AP I 设备 看获 得的是一 o bjec t 需要 行强

相比 RunT im eSt o r e P er s ist en tS t o r e 的好 久保 使 电数 不会 ,使用 P e r s ist en t S t o r e 要求存的 数据 须实现 P er s ist ab le 接口 代码 My Da t a P er s ist en tS t o r e M yDa t a 要实 P er s ist ab le 接口:

public class MyData implements Persistable {

// 其中为 MyData 方法 属性定

}

P er s ist en tS t o r e 对象整型 ID 为标 对象都 以这 型的 I D   数。 象和 不冲 通过 ha s h 成一 ID Bla ck Ber ry   E cl ips e   P lu g-i n 供了 个方 法将 ,选 击右 Co n v er t St r in g t o lo ng ”, 可以 成长 数。

无论 数, ID 类似

public static long PersistentID   = 0x815402392d453a9d L;

P er s ist en t ID 后, P er s ist en tS t o r e g et P er s ist en t Ob ject 获得所 保存 象, g et P e r s ist en t Ob ject   方法只有一 个参 ID ,本 使 面定 P er s ist en t ID

获得 以通实例 g et Co n t en t s 方法在设 备内 对象以通 s et Co n t en t s   将内存 持久 象的 得要 Ob j ect 强制使的类 在保要调 P ers ist en tSot r e

  c omm it 存动 作。

P ers ist en tS t o r e 使代码 片段 下:

PersistentObject persistentStore ;

persistentStore   = PersistentStore. getPersistentObject ( PersistentID );

synchronized ( persistentStore ) {

if ( persistentStore .getContents() == null ) { myData   = new MyData(); persistentStore .setContents( myData ); persistentStore .commit();

}   else   {

myData   = ( MyData) persistentStore .getContents();

}

}

}

 

 

使 SQLit e

 

 

  Bla ck Be rry   5 . 0   平台供了   S ql it e   支持 使可以 Bla ck Be rry 手机 使 。对 MI Dl et   Bl ac kBe rry   言, 一个使 数据 序更

当然 储方 前的 RMS   为关 看应 规模 数据 档结 不建 议使 规模较大 而且 批量 的数 据, 使 比较 利。

从具 ,在 Bla ck Berr y   Da t ab a s eF a ct o ry   可以 连接数 据库以一 个文 内存 以是

    Da t ab a s e      Da t ab a s e    实例 cre a t eSt a t emen t 创建 一句 S QL S t a t emen t pr ep ar e 准备 后通过该实   e x ecut e   方法执行。 果是查询语句,可   p r epa r e   方法执行后, g et Cu r so r 光标 得所

下面 据库

String dbLocation = "/SDCard/databases/SQLite Demo /" ; URI uri = URI.create (dbLocation + "mydb " );

Database   db = DatabaseFactory. openOrCreate (uri, new

DatabaseSecurityOptions( false )) ;

 

 

下面 码片

Statement statement = _db .createStatement( "SELECT * FROM Category" );

statement.prepare();

Cursor cursor = statement.getCursor();

 

 

下面 代码 段:

Row row;

int id; String nam e;

while (c ur s or .n ex t( ))

{

 

ro w = c ur so r. ge tR ow () ;

id = r o w. ge tI nt eg er(0);

na me = ro w. ge tS tr in g( 1) ;

}

使用得要   S t a t emen t   Cu r so r 例关 闭,

statement. close();

cursor.clo se();

对于 S QLi t e 使用 关键 点是 S QLi t e S QL S QL 功能 据格 式上 In t eg er T e xt 类型 一方 持的 S QL ,不 支持

有关   S QLi t e 以在 到:

h t t p://www .s ql it e.o r g /

 

使用全局事件 进行应用交

 

 

对于通讯 数据 数据 标应 行响

Bla ck Be rry   件模 用之 Bla c kBe rry   上的 何应 用程 听全 件的 ID   应用 有监 取, 通过 I D   对该 事件 中可 的数 使 来会 于大 的方 特定 空间 中, 标应

首先 件, Bla ck Ber ry 规范:

l      定义   ID 变量

l        ID 从而使 引用到

l      通对包名 HA S H ID ,使 ID 无二 示例

public static long GLOBAL_ID = 0xba4b84944bb7429eL;

 

 

定义 该事 , 事件 ID po s t G lo ba lE v en t ( )   方法中   我们

Bla ck Be rr y 同的 简单入事 I D 不带 数据 发布 整数 的可 以在 作为 可以 程序使 什么 件。

最简 代码 下:

ApplicationManager.getApplicationManager()

.postGlobalEvent(GLOBAL_ID);

 

 

对于 要考

 

·      全局 是一 程序

·      监听   G lo ba l E v en t List ene r 接口

·      监听 G lo ba lE v en t List ener 实例

 

实现 Globa lEven t L ist e n e r 和添加 ClobalEve nt L i stene r 的示例代码如

 

class     GlobalEventListenerApp       extends     UiApplication      i mp le me nt s

GlobalEventListener {

 

 

public GlobalEventListenerApp() {

addGlobalEventListener ( this );

}

}

 

 

对于   G lo ba lE v en t List ener   ev e n t O cc ure d 全局 事件的

发生 不管 管事 序发事件 只要 G lo ba lEn v en t List ene r ev en t O cc ur e d 会被 调用 着开 事件 ID ID 才对 响应

public void eventOccured( long guid, int data0, int dat1,

Object object0, Object object1 ) {

// 注意这里需要 ID 是不 需要 应的事件

if (guid == Gl ob al E v e n t F i r i n g A p p .GLOBAL_ID) {

// 在这里完成事件响

}

}

 

 

 

接收推送数据

 

 

数据推送 Bla ck Be rry 台的 端有 务器 以将 数据机上 手机 方式 需要 架构 Bla c kB er r y 推送 的相 小节 MI Dl et 应用 送数 法。

 

应用自启动

 

 

如果 服务 般而 听应 则有 启动 被客 收。

  Bla ck B er ry   平台上要自动启 一个应用程序比较简单 可以直接通过设置完成 Bla ck Be rr y Bla ck B er ry_ App _De s cri pt o r .xm l ,在 G en er al In f o rm a t io n 栏下 Aut o -run o n s t art up 目中 的应 自动 动。

 

 

 

需要 Aut o -r un o n   s t art up 类型 Bla c kBe rry App li c a t io n

时可 选择 MI Dl et ”的使 Aut o -r un o n st art up 选项。

所以   Bla c kBe rry 使用标准   MI Dl et

有关 Bla ck B er r y 项目 的创 请参 相关 文档 Bla c kBe rry 项目 启动 Bla ck B er ry 应用 与普 ja v a 应用一样 m ai n 作为 入口。

为了 行控 例模 为类   P us he dD a t aLi s t ener

个静   m ai n

public static void main(String[] args) { PushedDataListener. waitForSingleton ().start();

}

 

 

取单 态方法 通的单 方法 该方 的返 P us he dD a t aLi s t ener   。在 使   R un t im eSt o r e   保存 起来 Run t im eS t o r e   例的 则从   Run t im eSt o r e   中获 新的 回。

public static PushedDataListener waitForSingleton() {

// make sure this is a singleton instance

RuntimeStore store = RuntimeStore. getRuntimeStore (); Object o = store.get( RTSID_MY_APP );

if   (o   == null )   {

store.put( RTSID_MY_APP , new PushedDataListener());

return (PushedDataListener) store.get( RTSID_MY_APP );

} else {

return (PushedDataListener) o;

}

}

推送侦听

 

 

从上 看到后调 用了 s t art 方法 P us h e dD a t aLi s t ener

              线                 s t art                                         

List ener Th re a d 启动 线

List ener Th re a d   主要 通过 断从 接中 来的 据。

首先 St r e am Co nn ect io nNot ifi e r S t re a m Co nn ect io nNot ifi e r 创建 接。 其次 St r e am Co nn ect io n In putSt re am 连接 于侦 听。

StreamConnectionNotifier notify = null ; StreamConnection stream = null ; InputStream input = null ;

定义 St r e am Co nn ect io nN ot ifi er Co nn ect o r o pen 连接 Co nn ect o r

是一 于连 接不 h t t p so ck et 的时 候都 使 o pen 中传入 U RL 。网 络的 U RL 数的 区分 h t t p U RL h t t p:// so ck et U RL so ck et : // 不属协议 所以 U R L h t t p:// : <po rt > 推送

U RL h t t p:// 开头 h t t p <po rt > 为端 口号 服务使 一个 打开 边接 LIS TEN _U R L ”为 定义 h t t p:// : 9 1 1 其中 9 1 1 为约 口。

notify = (StreamConnectionNotifier) Connecto r.open ( LISTEN_URL );

                                                               St re am Co nn ect io nNot if ier          

St re am Co nn ect io nN ot ifi er 后就 听获

循环 句为   not ify .a cc ept And Op en 一句 语句线 等待 再执 到达。

    ac c ept And Op en        St re am Co nn ect io n    St re am Co nn ect io n 实例的 o penI np ut St re am 获得 入流 数据。

注意 St re am Co nn ect io n 关闭 待下 一个 据。

侦听

for (;;) {

stream = notify.acceptAndOpen();

input = stream.openInputStream();

// 在这里 过对 input 的操 作获得 送数据

input.close(); stream.close(); stream = null ;

}

另外 流的 原因 异常 一种方法是在循环内处 异常,处理完了继续循 但是这无   C o nn ect o r .o pen 方法 在循 Co nn ect o r .o pen 包含 进来 的例

子就 使 这种 式也 当输 理有的时 会跳 送数

最终 重循 上异 的异 处理 负责 Co nn ect o r .o pen 的异 理后 Co nn ect o r .o pen 接。 内层 行处 数据 通过 Co nn ect o r .o pen 打开连接 开发 为简 循环的方式

 

侦听程序与主 序的交

 

 

获取 工作 据到 进行处理 因为 作由 MI Dl e t 主程 可以 Bla ck Be rr y   作为 MI Dl et   交互 使用 G lo ba lE v en t 程序 享数 程序 共享 再进 新处 法不

 

 

推送侦听的完

 

 

下面 整代 部分:

package cn.searb;

 

 

import java.io.IOException;

import java.io.InputStream;

 

 

import javax.microedition.io.Connector;

import javax.microedition.io .StreamConnection;

import javax.microedition.io.StreamConnectionNotifier;

 

 

import net.rim.device.api.system.RuntimeStore;

import net.rim.device.api.ui.UiApplication;

 

 

public class PushedDataListener extends UiApplication {

 

 

public static final long RTSID_MY_APP   = 0x68b31bd292413108L;

private static final String LISTEN_URL   = " ht tp :/ /: 91 1" ; // th e li st en port

private ListenerThread myThread ;

 

 

public static void main(String[] args) { PushedDataListener. waitForSingleton ().start();

}

 

 

public PushedDataLi stener() {

 

 


 

 

myThread = new ListenerThread();

}

 

 

public   static PushedDataListener   waitForSingleton() {

// make sure this is a singleton instance

RuntimeStore store = RuntimeStore. getRuntimeStore (); Object o = store.get( RTSID_MY_APP );

if   (o   == nu ll )   {

store.put( RTSID_MY_APP , new PushedDataListener());

return (PushedDataListener) store.get( RTSID_MY_APP );

} else {

return (PushedDataListener) o;

}

}

 

 

public   void start()   {

invokeLater( new Runnable() {

public void run() {

myThre ad .start();

}

});

 

 

this .enterEventDispatcher();

}

 

 

class   ListenerThread   extends   Thread   {

 

 

public void run() {

System. out .println( "DemoOA BackGroundThread -- running" ); StreamConnectionNotifier notify = null ;

StreamConnection stream = null ; InputStream input = null ;

try {

sleep (1000);

} catch (Exception e) {

}

 

 

try {

 

 

notify = (StreamConnectionNotifier) Connector.open ( LISTEN_URL );

 

 

for (;;) {

stream = notify.acceptAndOpen();

input = stream.openInput Stream();

 

 

//

 

 

stream.close();

stream = null ;

 

 

}

} catch (IOException e) { System. err .println(e.toString());

 

 

} finally {

try {

if (stream != null ) {

stream.close();

}

} catch (Exception ex) {

}

try {

if (notify != null ) {

notify.close();

}

} catch (Exception ex) {

}

}

}

}

}

 

 

 

 

小结

 

 

通过 发现 MI Dl et   Bla ck Be rr y   ,同 发人 时间 定移 度。

不过移植 MI Dl et   Bla ck Be rr y   优势 果希 Bla c kBe rry 需要 根据 Bla ck B er r y 的特 点重 进行 现。

 

 

 

 
 

 

 

BlackBerry SDK下载

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值