本文目的是说明midp中的属性问题,主要涉及到jad和manifest.mf文件的一些概念。事实上很多人并不清楚这方面的细节。所以你应该仔细读读这篇文章.
通常midp的应用程序是以.jar文件和.jad文件发布的。jar文件就是我们所说的jar包,jad文件的全名是java application descriptor。在jad文件中包含着application management software用来管理midlets的生命周期的信息,当然也包括很多重要的属性。他们是成对出现的例如:midlet-name:myjava。你可以通过调用getappproperty("midlet-name")来得到string类型的myjava,这是非常方便的,如果你想让你的midlet去联网那么你可以定义一个name为server_url,把它的值定义为http://yourip:port/myservlet,这样如果你想去连接其他地址的话只需要修改jad文件了,不需要重新编译。因此我们要清楚一点在jad文件里面放置一些midlet初始化需要的值是比较可取的。
在jar包里面包括一个目录meta-info里面有个文件是manifest.mf。它是用来描述jar文件的,也包含一些其它的信息,你可能发现了,在manifest.mf和jad文件中的一些值是相同的。那么这就存在着一个规则,ams如何决定去读取哪个值呢?答案是这样的。
如果midlets的jar包是signed的,那么ams要去察看它的数字签名,如果是有效的那么它会首先去读取manifest.mf的内容,然后读取jad文件中相同的内容,如果匹配的话那么它会安装这个jar包,如果不匹配的话就会拒绝安装。如果他发现数字签名无效的话直接就会拒绝安装。
如果mdilets的jar包是unsigned的话,那么ams就把它认为是非信任的,他去读取jad文件的属性,如果发现没有的话它去读取manifest的内容,也就是说如果jad和manifest里面都有的属性ams只会去读取jad中的。
下面这个逻辑看上去是比较清楚的:
given : string key // attribute name
return : string value
throws : nullpointerexception if key is null
if trusted
string v0 = lookup key in manifest
string v1 = lookup key in descriptor
if ( v0 != null && v1 != null )
// found in both; must be the same value
assert( v0.compareto( v1 ) == 0 );
value = ( v1 != null )? v1 : v0;
else // untrusted
value = lookup key in descriptor
if value == null
value = lookup key in manifest
return value
下面简单介绍一下midp2.0中定义的一些重要的参数,在midp2.0中定义了18个值。其中在manifest.mf和jad中都必须定义的有六个,他们是:
midlet-name
midlet-version
midlet-vendor
microedition-profile
microedition-configuration
midlet-n
由于一个midlet suite里面可以有多个midlet的,因此你要说明他们比如midlet-1,midlet-2.....midlet-n,这一点非常的重要,在部署jar和jad文件到手机的时候一定要确保midlet-name的正确,它的值是你的jar包的名字!否则不会安装成功的。还有两个值是jad文件中不许有的他们是midlet-jar-url ,
midlet-jar-size 其中应该注意的是midlet-jar-url,如果你要是通过ota下载的话,那么你不许让他指向你jar包的绝对地址,例如http://myip:port/app/myapp.jar。
关于一个midlet suite里面有多个midlet的情况我写了个简单的代码测试了一下,如果还有疑问的话你可以运行一下下面的程序:
import javax.microedition.lcdui.display;
import javax.microedition.lcdui.form;
import javax.microedition.midlet.midlet;
import javax.microedition.midlet.midletstatechangeexception;
/*
* created on 2004-7-14
*
* todo to change the template for this generated file go to
* window - preferences - java - code style - code templates
*/
/**
* @author e2412c
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
public class midlet1 extends midlet
{
private display display;
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#startapp()
*/
protected void startapp() throws midletstatechangeexception
{
// todo auto-generated method stub
display = display.getdisplay(this);
display.setcurrent(new form("1"));
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#pauseapp()
*/
protected void pauseapp()
{
// todo auto-generated method stub
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#destroyapp(boolean)
*/
protected void destroyapp(boolean arg0) throws midletstatechangeexception
{
// todo auto-generated method stub
}
}
import javax.microedition.lcdui.display;
import javax.microedition.lcdui.form;
import javax.microedition.midlet.midlet;
import javax.microedition.midlet.midletstatechangeexception;
/*
* created on 2004-7-14
*
* todo to change the template for this generated file go to
* window - preferences - java - code style - code templates
*/
/**
* @author e2412c
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
public class midlet2 extends midlet
{
private display display;
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#startapp()
*/
protected void startapp() throws midletstatechangeexception
{
// todo auto-generated method stub
display = display.getdisplay(this);
display.setcurrent(new form("2"));
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#pauseapp()
*/
protected void pauseapp()
{
// todo auto-generated method stub
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#destroyapp(boolean)
*/
protected void destroyapp(boolean arg0) throws midletstatechangeexception
{
// todo auto-generated method stub
}
}
import javax.microedition.lcdui.display;
import javax.microedition.lcdui.form;
import javax.microedition.midlet.midlet;
import javax.microedition.midlet.midletstatechangeexception;
/*
* created on 2004-7-14
*
* todo to change the template for this generated file go to
* window - preferences - java - code style - code templates
*/
/**
* @author e2412c
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
public class midlet3 extends midlet
{
private display display;
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#startapp()
*/
protected void startapp() throws midletstatechangeexception
{
// todo auto-generated method stub
display = display.getdisplay(this);
display.setcurrent(new form("3"));
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#pauseapp()
*/
protected void pauseapp()
{
// todo auto-generated method stub
}
/* (non-javadoc)
* @see javax.microedition.midlet.midlet#destroyapp(boolean)
*/
protected void destroyapp(boolean arg0) throws midletstatechangeexception
{
// todo auto-generated method stub
}
}
jad文件的内容如下:
midlet-3: midlet3,,midlet3
midlet-2: midlet1,,midlet1
midlet-1: midlet2,,midlet2
midlet-jar-url:
闽公网安备 35060202000074号