`
izuoyan
  • 浏览: 9221447 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2ME中文教程 9 MIDP 2 Push技术

阅读更多

作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=270

9.1 Push技术概述

Push技术是一种通过异步方式将信息传送给设备并自动启动MIDlet程序的机制。通常我们进行网络连接的时候,是客户端主动去连接服务器,服务器处理请求并返回给客户端响应,这是同步处理机制。而Push技术不同,它不需要应用程序通过“拉”的方式通过网络取得数据,应用程序需要的数据会被主动“推”向设备。当设备接收到信息的时候,相关的MIDlet会被激活并开始运行,处理发送过来的数据。一般来说用户是不需要参与这个过程的。Push技术使得MIDlet同设备更加紧密地集成了起来,使得MIDlet程序在设备上的启动更加的平滑自然。这显然让MIDlet应用更具竞争力。

值得注意的是,PushMIDP2.0的一个可选项。换句话说设备可以支持、不支持、或者部分的支持Push技术。

9.1.1 Push技术的分类

我们知道Application Management Software(AMS)是负责MIDlet的生命周期管理的,包括运行、暂停和销毁等。Push RegistryAMS的一个重要的组件,是AMS的一部分,它提供了Push的应用编程接口并跟踪push注册事件。在MIDP2.0中,Push机制可以通过如下两种方式激活MIDlet

1)通过inbound网络连接(就是基于接入的连接的通知)

2)通过基于计时器的时钟(又称基于警告的通知)

下图是说明了MIDlet激活与生命周期的联系,供读者参考:

fig 2

图一:MIDlet激活方式与生命周期关系图

9.1.2 PushRegistry应用编程接口

首先我们介绍一下PushRegistry应用编程接口,PushRegistry是通用连接框架(Generic Connection Framework)中的一个类,它提供了所有和push相关的方法。我们这里只是简单列出了主要的方法,读者可以参考MIDP 2.0 API文档得到更多信息。

方法总结

staticString

getFilter(Stringconnection)
取得指定连接的过滤器

staticString

getMIDlet(Stringconnection)
取得指定连接的注册MIDlet

staticString[]

listConnections(booleanavailable)
返回当前MIDlet套件中注册的连接列表

staticlong

registerAlarm(Stringmidlet, longtime)
注册一个计时器来启动参数指定的应用程序

staticvoid

registerConnection(Stringconnection, Stringmidlet, Stringfilter)
在应用程序管理软件中注册一个动态连接

staticboolean

unregisterConnection(Stringconnection)
删除一个动态连接注册

通过使用PushRegistry我们可以把一个MIDlet注册到Push事件中并可以取得push相关的信息。

MIDP2.0中,Push的处理是由AMSMIDlet共同负责的,这样有利于简化AMS的实现,同时也可以避免把信息push到设备的方式和格式限制的过于严格。下面我们了解一下Push处理的过程,首先假设一个MIDlet已经被注册到push事件中:

1)首先,当MIDlet没有被激活的时候,AMS负责监视某个MIDlet的注册事件,一旦注册事件发生的时候,AMS会激活相关的MIDlet来进行下一步的处理。

2)当MIDlet正在运行的时候,MIDlet自己要负责所有的push事件的处理。主要是inbound网络连接和时钟事件。

9.2 静态注册与基于inbound网络连接的Push

下面我们将采用讲解和实例结合的方式来说明如何使用Push机制开发J2ME应用程序,

我们将使用SUN提供的Wireless Toolkit(WTK)做为运行环境。

Push注册中有两种方式:静态注册和动态注册,静态注册是在MIDlet套件安装的时候完成的。你需要通过在MIDlet套件的jad文件中指定MIDlet-push字段的信息。并且当我们想测试应用程序的时候,不能只是简单的选择RUN,而必须要使用WTK提供的RUN via OTA功能把MIDlet套件通过AMS安装好,然后测试Push功能。

静态注册需要我们在jad文件或者manifest文件中提供MIDlet-push字段的内容,每个push注册实体需要提供如下的内容:

MIDlet-Push-<n>: <ConnectionURL>, <MIDletClassName>, <AllowedSender>

l MIDlet-Push-<n>push注册的属性名称,一个MIDlet套件可以有多个Push注册属性。

l ConnectionURL是在Connector.open()中使用的连接字符串

l MIDletClassName是在Push Registry中进行注册的MIDlet名称,一定要包括包名,例如com.j2medev.push.PushMIDletMIDletClassName一定要是在jad文件中记录的。

l AllowedSender是用来说明过滤器的,可以对激活MIDlet的来源进行限制。我们可以直接指定ip地址,如192.16.8.0.12。也可以使用通配符“*”和“?”,其中“*”表示任意地址都可以访问,而“?”代表一个单独的字符串。如192.168.0.

下面给出一个静态注册的基于inbound连接的Push实例。我们编写一个简单的MIDlet应用程序,并在安装过程中完成静态注册。然后我们起一个socket连接来激活这个MIDlet。整个过程分为注册、监听、运行、处理数据四部分。

9.2.1 注册

使用WTK新建项目命名为push,并指定MIDletcom.j2medev.push.PushMIDlet

读者可以使用喜欢的文本编辑器编写一个简单的MIDlet,这里给出的参考代码如下:

package com.j2medev.push;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.lcdui.*;

public class PushMIDlet extends MIDlet {

private Display display;

protected void startApp() throws MIDletStateChangeException {

display = Display.getDisplay(this);

display.setCurrent(new Form("Push"));

}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

}

通过WTK提供的设置功能编辑Jad文件把注册信息写入MIDlet-Push字段。

这里提供的Connection URL = socket://:5001,Class=com.j2medev.push.PushMIDletAllowed Sender = *。编辑后的jad文件如下:

MIDlet-1: push, push.png, com.j2medev.push.PushMIDlet

MIDlet-Jar-Size: 1329

MIDlet-Jar-URL: push.jar

MIDlet-Name: push

MIDlet-Permissions: javax.microedition.io.PushRegistry

MIDlet-Push-1: socket://:5001, com.j2medev.push.PushMIDlet, *

MIDlet-Vendor: Unknown

MIDlet-Version: 1.0

MicroEdition-Configuration: CLDC-1.0

MicroEdition-Profile: MIDP-2.0

编译项目,正确无误后使用WTK提供的打包功能生成jar文件。这一步我们最重要的是使用wtk提供的RUN via OTA功能把MIDlet安装,这样才可以在安装的时候注册静态连接。从Ktoolbar选择Project->Run via OTA

这里我们不会详细介绍安装的步骤,当安装结束后WTK会弹出对话框询问push可能会接收网络连接的数据,这是收费操作。读者选择确定就可以了。

9.2.2 监听与启动

现在我们已经完成了静态注册的准备,下面我编写一个简单的Sender程序,目的是向设备建立socket连接,来产生inbound连接。代码如下:

package com.j2medev.socket;

import java.net.Socket;

public class Sender {

public static void main(String[] args) throws Exception {

new Socket("127.0.0.1",5001);

}

}

编译并运行Sender程序,我们将可以看到PushMIDlet被激活的时候弹出的对话框,选择okAMS将会激活PushMIDlet

MIDP2.0规范中并没有规定设备必须要支持什么协议,inbound连接的协议是具体设备实现相关的。即使设备支持一种连接协议,也不一定支持将他用于Push启动,请读者参考各个厂商的API取得相关信息。一般可以使用如下几种形式:1)基于消息的短消息服务 2)基于流的TCP sockets 3)基于包的数据报。

9.2.3 处理数据

你可能意识到了,我们的程序并没有处理那个激活MIDlet的连接。在一个真正的应用中,被唤醒的MIDlet应该在启动过程中判断自己是被用户打开的还是被利用push技术唤醒的。如果是被唤醒的,应用程序应该紧接着打开这个连接,处理数据。下面的代码示范了如何判断是否被唤醒:

String connections[]=PushRegistry.listConnections(true);//传入true表示仅仅取得接入的连接

for(int i=0; i< connections.length;i++) {

//利用这个连接字符串打开连接处理

}

9.3 动态注册与基于计时器的Push

动态注册是指通过使用PushRegistry应用编程接口在运行时进行注册。基于时钟和基于inbound连接的两种方式都可以使用动态注册,读者应该知道使用基于时钟的push方式只能通过动态注册。

基于时钟的动态注册比较简单,我们只是简单的调用PushRegistry的静态方法registerAlarm(String MIDlet,long time),这样当指定的时间到达的时候,AMS就会唤醒参数中指定的MIDlet。每个MIDlet只有一个基于计时器的注册,重复调用registerAlarm会覆盖上次的结果。下面我们给出一种基于时钟的Push动态注册的实例,我们的MIDlet会在程序结束后的10秒钟后自动启动。

依然使用前面我们新建的push项目,我们只是需要添加另外一个MIDlet命名为PushMIDlet2。代码如下:

package com.j2medev.push;

import java.util.Date;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.lcdui.*;

import javax.microedition.io.*;

public class PushMIDlet2 extends MIDlet {

private Display display;

protected void startApp() throws MIDletStateChangeException {

display = Display.getDisplay(this);

Form form = new Form("Push");

form.append("This is a push example");

display.setCurrent(form);

}

protected void pauseApp() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

scheduleMIDlet(10000);

display = null;

}

private void scheduleMIDlet(long delt)

{

try

{

Date now = new Date();

PushRegistry.registerAlarm(this.getClass().getName(),now.getTime()+delt);

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

jad文件内容如下:

MIDlet-1: push, push.png, com.j2medev.push.PushMIDlet

MIDlet-2: push2, , com.j2medev.push.PushMIDlet2

MIDlet-Jar-Size: 2222

MIDlet-Jar-URL: push.jar

MIDlet-Name: push

MIDlet-Permissions: javax.microedition.io.PushRegistry

MIDlet-Push-1: socket://:5001, com.j2medev.push.PushMIDlet, *

MIDlet-Vendor: Unknown

MIDlet-Version: 1.0

MicroEdition-Configuration: CLDC-1.0

MicroEdition-Profile: MIDP-2.0

重新编译项目、打包并通过RUN via OTA安装新的MIDlet套件。运行push2,这是一个很简单的应用程序。关闭它后系统会提示你是不是允许MIDlet接受自动信息,选择确定即可。10秒后push2会自动启动,表明我们完成了基于时钟方式的动态注册。

9.4 使用Push应注意的问题

9.4.1 安全性问题

使用Push增加了用户对安全性的担心。所以对Push的应用是在MIDP2.0的安全框架之下进行的。如果要使用Push需要申请javax.microedition.io.PushRegistry许可。

9.4.2 Push程序需注意的问题

l 利用Push启动的程序应该明确的和用户交互。一个被Push唤醒并运行在后台的程序会让用户产生很多疑惑。

l 如果处理inbound连接,应该在一个独立现程中进行。

l 正确使用Push技术,不要利用基于计时器的Push反复启动程序来检测网络更新,应该使用基于inbound连接的Push

由于篇幅有限,MIDP 2.0 Push讲解就介绍到这里,动态inbound的注册比较复杂,请参考www.j2medev.com的文章。

分享到:
评论

相关推荐

    j2me 中文教程 开发环境 J2ME语言

    J2ME 中文教程 by www.j2medev.com MIDlet 程序的机制。 第十章“MIDlet 的开发流程与部署”介绍了如何真正完成你的程序并打包发往设备运行。 第十一章“搭建开发平台—WTK”主要讲述J2ME 新手最常使用的开发工具...

    J2ME 中文教程

    第九章“MIDP 2.0 Push 技术”介绍了如何通过异步方式将信息传送给设备并自动启动MIDlet程序的机制。 第十章“MIDlet的开发流程与部署”介绍了如何真正完成你的程序并打包发往设备运行。 第十一章“搭建开发...

    J2ME 中文版教程

    本教程首先介绍了j2me 开发体系,然后深入各个MIDP2.0 API,最后是搭建平台的知识。 第一章 “J2ME 技术概述”让你在学习J2ME 以前知道什么是J2ME。本章介绍了J2ME 平 台的体系结构和MIDlet 生命周期的概念。为以后...

    J2ME 中文教程1.01a

    本教程是为了学习J2ME MIDP技术的开发者准备的。尽管本教程内容涉及初学阶段,但本教程不仅仅是一本入门的读物,很多的内容的详细程度对于有经验的开发者来说,也是很多脾益的。事实上,本教程假定初学者已经有了...

    j2me入门教程j2me入门教程j2me入门教程

    本教程将帮助初学者理解J2ME的基础概念和技术,以快速入门这个领域。 1. **J2ME架构** J2ME由两部分组成:配置(Configurations)和框架(Profiles)。配置定义了硬件和操作系统的基本需求,如Connected Limited ...

    j2me的midp2.0的源代码

    对于初学者或希望深入了解J2ME MIDP 2.0的开发者来说,这是一个宝贵的资源,可以深入学习和实践,掌握移动应用开发的关键技术。 总之,J2ME MIDP 2.0为移动开发提供了一套强大的工具集,使得开发者能够创建功能丰富...

    J2ME中文教程J2ME中文教程J2ME中文教程

    **J2ME中文教程概述** Java 2 Micro Edition(J2ME)是Java技术的一个重要分支,主要用于开发在资源有限的设备上运行的应用程序,如移动电话、智能家电、PDA和嵌入式系统等。这个"J2ME中文教程"针对初学者,提供了...

    j2me中文教程

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于开发和部署在嵌入式设备、移动电话和智能家电等...《j2me中文教程.pdf》这份文档应该会详细解释这些概念,并提供实例指导,帮助初学者快速上手J2ME开发。

    《J2ME应用教程》作者陈旭东—代码

    Java 2 Micro Edition (J2ME) ...通过学习《J2ME应用教程》中的代码实例,开发者能够掌握J2ME的核心概念和技术,进而创建能在多种移动设备上运行的应用程序。这份代码资源是深化理论知识并提升实践技能的重要辅助材料。

    J2ME实用教程.rar

    **J2ME(Java 2 Micro Edition)实用教程** J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能家电等。它提供了一个灵活的框架,使得开发者能够创建功能丰富的应用程序,这些应用程序可以在...

    J2ME实例教程(附有PPT,源码和例子)

    **J2ME实例教程概述** J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,专为资源有限的嵌入式设备、移动设备和消费电子设备设计。这个教程面向初学者,旨在通过实例教学的方式,帮助学习者掌握J2ME的基本...

    JAVA移动应用程序开发对于PUSH技术的运用分析.pdf

    JAVA移动应用程序开发对于PUSH技术的运用分析 JAVA移动应用程序开发对于PUSH...9. PUSH技术可以应用于J2ME平台下,实现JAVA移动应用程序的自动启动运行。 10. PUSH注册机制可以通过MIDP2.0中的通用连接框架来实现。

    j2me常见问题(push,cmnet,cmwap,rms,字符转码...)

    通常,J2ME应用会通过监听Socket或者使用MIDP Push Registry来接收Push消息。 接着,我们来了解CMNET和CMWAP,这两个术语是与中国移动网络相关的。CMNET代表China Mobile Network,是一种无限制的互联网接入方式,...

    J2ME——all

    1. **JAR and WAP Push**:J2ME应用打包为JAR文件,可通过WAP推送技术分发到设备。 2. **Signed Applications**:为了访问设备的受限功能(如联系人、短信),应用需要签名。 3. **Device Compatibility**:开发者...

    基于J2ME的手机游戏开发.pdf

    【正文】 ...总结,J2ME为手机游戏开发提供了一套完整的框架和工具,虽然现在已经被更现代的技术如Android和iOS SDK取代,但理解J2ME的原理和实践仍对了解移动游戏开发的历史和基础有着重要意义。

    基于 J2ME的手机短信平台的研究论文

    5. **PUSH机制**:利用MIDP 2.0中的PUSH技术,使得客户端能够自动连接服务器,实现了短信息收发的实时性。 #### 关键技术解析 ##### PUSH机制 PUSH机制是一种异步消息传输技术,它允许服务器端主动将信息推送至...

    J2ME水木清华精华帖

    此外,JSR 82(Java API for Bluetooth)和JSR 180(WAP 2.0 Push API)扩展了J2ME的无线通信能力。 7. **数据存储** Record Management System (RMS) 是J2ME中用于本地数据存储的机制,可以存储键值对或记录集,...

    j2me试题集锦2(含答案)

    Push服务可能引发安全性问题,需在MIDP2.0的安全框架下使用,并申请权限。 二、选择题解析: 1. D. 分时技术允许线程运行直到时间片结束,然后切换到其他相同优先级的线程。 2. A. setTransform(...)用于旋转Sprite...

Global site tag (gtag.js) - Google Analytics