用polish辅助管理J2ME程序的生命周期:

polish辅助管理J2ME程序的生命周期:

通常的生命周期:

1.       设计:计划应用程序的架构

在这个阶段,你追求架构越简单越好。纯oo可能不是最适合J2ME的(每个类增加的负载,每层抽象拖慢了程序),但你要尝试创建一个清晰和逻辑化的结构,以便以后的改动不带来意外的副作用。

几点建议

                        i.              避免使用虚类和接口,你会发现在不使用抽象下保持灵活性能大大提高预处理的效率

                      ii.              每一个类都增加程序大小,尝试组合功能来减少类的数量

                    iii.              只有必要时候才实现接口,例如,与其每一个screen实现一次CoammandListener接口,不如使用单独一个分派器,或控制器来负责程序流。不要创建自己的虚事件处理系统(减少多态的使用咯)

                     iv.              通过定义独立的类或模块来设计重用,使其可应用到其他的上下文或程序。检查,你是否将其参数化,不要害怕使用不同的包。混淆阶段和POLISH会帮你把所有的类放到一个默认包,所以应用程序大小会减少。

                       v.              不要过度优化程序,例如将整个应用程序放到一个类,将大规模的优化放到优化阶段,记得有些设备能接受的最大类体积只有16KB

                     vi.              不要复制功能,例如如果你使用POLISH GUI,尝试使用这些类而不是自己另外实现一套

                   vii.              使用经过验证的,稳定的第三方api而不是自己实现,除非你的核心事务需要特定的功能。因为不同设备有不同的表现,创建一套稳定的j2me api是很有挑战性并且复杂的工作

 

2.       实现:实现设计,编码

a)         除了代码你还经常要创建图像和服务器端应用程序代码等。

b)        POLISH提供了强壮的api,包括UI,网络,工具任务等,来帮助你实现程序。IDE插件能够减少预编译的代码和达到很快的提交速度

 

3.       构建:编译,创建应用程序包(Jar + Jad

a)         编译

b)        预审

c)         打包类和资源到jar

d)        创建jad

e)         选择正确的资源,翻译程序,预处理,混淆等

4.       测试:检查实现

J2ME polish的日志框架,提供不同的日志级别和在真机上查看日志信息的功能。你可以指定包和类的日志级别,关闭日志功能等。

5.       优化:性能,内存占用,程序大小,设备调整相关的优化

a)         设备相关的Bug:使用预编译来绕过

b)        应用程序大小:自动的资源汇编(auto resource assembling)来优化资源使用和调整程序架构。

c)         程序性能

6.       部署:安装在设备

a)         蓝牙,红外或数据线

b)        OTA发布

最简单的WML发布页面:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"

"http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

<card title="Download" id="main">

<p>

<a href="myapplication.jad">Download Application</a>

</p>

</card>

</wml>

这个wml页面可以通过wap访问,提供一个到jad的链接,当设备读到jad文件,它会将控制权交给AMS应用程序管理器。Ams接着显示详细信息(标题,提供者,大小)和提示用户下载jar

许多web服务器已经能够处理jar,jad文件。如果你的设备无法识别文件,添加text/vnd.sun.j2me.app-descriptor MIME 类型 application/java web服务器的配置文件

如果你访问wml页面有问题,需要查看连接设置,有些wap网关不允许80端口以外的,所以如果遇到问题,请测试这个端口

在更加复杂的情况下, 你会通过设置UA和使用客户端脚本技术如JSP,PHP来发布。你也可能会通过二进制短信息来发布到jad的连接(作为一个wap连接)或者使用简单的文本信息。

同样,第三方的ota服务器也是可能的。需要不同的发布技术,设备识别,自费条款。

c)         彩信发布

有些设备能用彩信接收J2ME程序,你只需要一个sms中心来发送信息给你,不需要额外的交互

 

检查你的安装状态:

J2ME 标准可以告知每次安装和移除程序,可选的jad属性MIDlet-Install-Notify包含一个http地址,没有安装之后都被调用。设备尝试调用该地址,在内容里汇报状态,如900 Success,如果web服务器在安装过程中设置cookiecookie可以被返回。

A Notification of a Successful Installation

POST http://foo.bar.com/status HTTP/1.1

Host: foo.bar.com

Cookie: Name="abc"; Domain=".foo.bar"; Path="/app-dir"; /

JSESSIONID="123"; VERSION="1"

Content-Length: 13

900 Success

 

Status Code  &&  Status Message

900 Success

901 Insufficient Memory

902 User Cancelled

903 Loss of Service

904 JAR Size Mismatch

905 Attribute Mismatch

906 Invalid Descriptor

907 Invalid JAR

908 Incompatible Configuration or Profile

909 Application Authentication Failure

910 Application Authorization Failure

911 Push Registration Failure

912 Deletion Notification

 

 你也可在jad里面配置MIDlet-Delete-Notify

 你也可定义Polish<info>里面的installNotifydeleteNotify

 

 

7.       升级你的程序:

a)         MIDP 1.0

                        i.              MIDP 1.0无法在应用程序里面启动升级

                      ii.              升级策略:

1.         当你跟服务器端应用程序第一次握手时,查看当前版本号。当你发现有更新,而且用户选择升级,你必须发送一个sms文本信息,其中包含到服务器上最新JAD文件的链接。很多设备现在可以识别sms里面基于HTTPlink和自动启动wap浏览器

2.         发送一个包含wap链接的二进制信息给用户,用户可以保存和打开

3.         通过mms信息发送整个程序给用户。最用户友好的方式,但并不都能支持。

b)        MIDP 2.0

                        i.              你可以在应用程序内部发出一个平台请求来更新。 因为这种方法直接在真机上处理,所以你必须准备在安装更新后退出程序。无论如何, 你的应用程序都有可能在升级之前被关闭。

                      ii.              升级应用程序的实例:

package com.apress.update;

import javax.microedition.io.ConnectionNotFoundException;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.rms.RecordStore;

import javax.microedition.rms.RecordStoreException;

public class UpdateMidlet extends MIDlet {

private static final int VERSION = 125; // 1.2.5

public UpdateMidlet() {

super();

}

protected void startApp() throws MIDletStateChangeException {

try {

RecordStore versionStore = RecordStore.openRecordStore( "version", false );

versionStore.closeRecordStore();

byte[] versionData = versionStore.getRecord(

versionStore.getNextRecordID() - 1 );

String versionStr = new String( versionData );

int version = Integer.parseInt( versionStr );

if ( version != VERSION ) {

// app has been updated:

showUpdateMessage();

// remove version record store:

RecordStore.deleteRecordStore("version");

return;

}

} catch (RecordStoreException e) {

// no update has been requested

}

showMainMenu();

}

protected void requestUpdate() {

//#ifdef polish.midp2

try {

// request update:

//#if updateUrl:defined

//#= platformRequest( "${updateUrl}" );

//#else

platformRequest( "http://www.company.com/app/update.jad" );

//#endif

// persist current version:

RecordStore versionStore = RecordStore.openRecordStore(

"version", true );

byte[] versionData = Integer.toString( VERSION ).getBytes();

versionStore.addRecord( versionData, 0, versionData.length );

versionStore.closeRecordStore();

} catch (ConnectionNotFoundException e) {

//#debug error

System.out.println("Unable to issue update request" + e );

} catch (RecordStoreException e) {

//#debug error

System.out.println("Unable to persist current version" + e );

}

//#endif

}

protected void showMainMenu() {

// TODO implement showMainMenu

}

protected void showUpdateMessage() {

// TODO implement showUpdateMessage

}

protected void pauseApp() {

// ignore

}

protected void destroyApp(boolean unconditional) throws

MIDletStateChangeException {

// exit gracefully

}

}

设备应该请求用户是否在升级时候保存数据,在大多数情况下,至少可能在rms中保存数据。当然根据你的需求,你也可能考虑在服务器端保留用户数据。这样你就可以把用户id添加到升级JAd文件,当程序启动而没有用户数据,你可以查看ID而从服务器端下载用户数据

这里的安全风险在于,jad文件会很容易被改变,所有你i必须检查用户身份,而且用户能够登录并修改ID

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值