`
skycode
  • 浏览: 39163 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Midlet的Push技术

    博客分类:
  • J2ME
阅读更多

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

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

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

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


方法总结

static String
getFilter(String connection)
        取得指定连接的过滤器

static String
getMIDlet(String connection)
        取得指定连接的注册MIDlet

static String[]
listConnections(boolean available)
        返回当前MIDlet套件中注册的连接列表

static long
registerAlarm(String midlet, long time)
        注册一个计时器来启动参数指定的应用程序

static void
registerConnection(String connection, String midlet, String filter)
        在应用程序管理软件中注册一个动态连接

static boolean
unregisterConnection(String connection)
        删除一个动态连接注册

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

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

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

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

静态注册与基于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>


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

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

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

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

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

注册
使用WTK新建项目命名为push,并指定MIDlet为com.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.PushMIDlet,Allowed 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可能会接收网络连接的数据,这是收费操作。读者选择确定就可以了。

监听与启动
现在我们已经完成了静态注册的准备,下面我编写一个简单的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被激活的时候弹出的对话框,选择ok,AMS将会激活PushMIDlet。

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

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


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

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

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

}

动态注册与基于计时器的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会自动启动,表明我们完成了基于时钟方式的动态注册。

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

Push程序需注意的问题
利用Push启动的程序应该明确的和用户交互。一个被Push唤醒并运行在后台的程序会让用户产生很多疑惑。
如果处理inbound连接,应该在一个独立现程中进行。
正确使用Push技术,不要利用基于计时器的Push反复启动程序来检测网络更新,应该使用基于inbound连接的Push

分享到:
评论

相关推荐

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

    JAVA移动应用程序开发对于PUSH技术的运用分析 JAVA移动应用程序开发对于PUSH技术的运用分析是基于J2ME平台的移动应用程序开发中的一种重要技术。PUSH技术是一种新兴技术,基于C/S模式,可以实现将服务器中的相关...

    PUSH注册机制在JAVA移动应用程序开发中的使用.pdf

    PUSH技术具有信息主动性和及时性的特点,其主要通过服务器主动寻找用户,并采用筛选机制来实现信息的发送。 PUSH注册机制是JAVA移动设备应用程序开发的一种被自启动的方法,PUSH注册机制位于AMS(应用程序管理软件...

    移动信息设备简表MIDP概述.pdf

    4. **Push技术**:支持向设备推送数据和服务,使实时信息更新成为可能。 5. **网络功能**:MIDP提供了网络访问接口,支持HTTP协议,允许MIDlet进行网络通信。 6. **基本声音功能**:通过MIDP与Mobile Media API...

    Java技术大系.pdf

    2. **MIDP2.0编程**:书中深入解析了MIDP2.0的核心组件,如GUI、记录管理系统(RMS)、游戏开发API、网络连接、安全模型和PUSH注册机制,以及移动多媒体API、PDA可选API、Java蓝牙API、移动3D图形编程等。...

    从零开始学Java ME手机开发光盘

    全书以无线行业Java技术规范JTWI(JSR-185)为基础,内容涵盖了用户界面设计、事件处理、游戏设计、网络编程、多媒体、本地持久存储、Push注册、无线消息、无线程序发布、安全架构、国际化等主要技术。从编程实战...

    J2ME 中文教程

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

    J2ME 中文版教程

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

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

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

    midp2.0接口文档(英文版)

    **Midp2.0接口文档(英文版)详解** Midp2.0,全称Java ME MIDP(Mobile Information...虽然本文档是英文版,但为了开发高质量的跨平台移动应用,熟悉英文技术文档是必要的,因为很多最新的技术和资源都是以英文为主。

    J2ME中文教程

    #### 九、MIDP 2.0 Push技术 - **Push机制**:允许服务器端主动向客户端发送数据的机制。 - **应用场景**:实时消息通知、数据更新推送等。 #### 十、MIDlet的开发流程与部署 - **开发流程**:从编写代码到测试调试...

    J2ME 中文教程1.01a

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

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

    这本书的代码部分包含了各种示例,帮助读者更好地理解和应用J2ME技术。 J2ME由配置(Configurations)和框架(Profiles)组成。配置定义了基础的运行时环境,而框架则进一步细化了特定设备的功能集。例如,基础配置...

    J2ME培训实验手册v2.0

    ### J2ME培训实验手册v2.0 ...最后,本章详细介绍了MIDP2.0中的Push技术,这是一种用于推送数据到移动设备的技术。包括静态注册、动态注册、监听与启动等内容,以及使用Push技术时应注意的安全性和其他问题。

    j2me试题集锦2(含答案)

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

    J2ME中高级面试题

    对于那些致力于成为高级工程师或架构师的开发者来说,深入理解J2ME技术是至关重要的。以下是一些可能出现的J2ME中高级面试题目及其详细解析: ### 1. **J2ME架构与MIDP组件** - **KVM(K Virtual Machine)**:J2ME...

    J2ME移动设备程序设计

    总之,J2ME移动设备程序设计是一个涉及广泛技术领域的实践过程,需要开发者具备良好的面向对象编程基础,熟悉Java语法,并愿意去适应移动设备的特殊环境和限制。随着智能手机的普及,J2ME在现代移动开发中的地位虽已...

Global site tag (gtag.js) - Google Analytics