本文目的是说明MIDP中的属性问题主要涉及到jad和MANIFESTMF文件的一些概念事实上很多人并不清楚这方面的细节所以你应该仔细读读这篇文章 通常MIDP的应用程序是以jar文件和jad文件发布的jar文件就是我们所说的jar包jad文件的全名是java application descriptor在jad文件中包含着Application Management Software用来管理MIDlets的生命周期的信息当然也包括很多重要的属性他们是成对出现的例如MIDletNamemyjava你可以通过调用getAppProperty(MIDletName)来得到String类型的myjava这是非常方便的如果你想让你的MIDlet去联网那么你可以定义一个name为SERVER_URL把它的值定义//yourip:port/myservlet这样如果你想去连接其他地址的话只需要修改jad文件了不需要重新编译因此我们要清楚一点在jad文件里面放置一些MIDlet初始化需要的值是比较可取的 在jar包里面包括一个目录METAINFO里面有个文件是MANIFESTMF它是用来描述JAR文件的也包含一些其它的信息你可能发现了在MANIFESTMF和JAD文件中的一些值是相同的那么这就存在着一个规则AMS如何决定去读取哪个值呢?答案是这样的 如果MIDlets的jar包是signed的那么AMS要去察看它的数字签名如果是有效的那么它会首先去读取MANIFESTMF的内容然后读取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 v = lookup key in manifest String v = lookup key in descriptor if ( v != null && v != null ) // found in both; must be the same value assert( pareTo( v ) == ); value = ( v != null )? v : v; else // untrusted value = lookup key in descriptor if value == null value = lookup key in manifest return value 下面简单介绍一下MIDP中定义的一些重要的参数在MIDP中定义了个值其中在MANIFESTMF和jad中都必须定义的有六个他们是 MIDletName MIDletVersion MIDletVendor MicroEditionProfile MicroEditionConfiguration MIDletn 由于一个MIDlet suite里面可以有多个MIDlet的因此你要说明他们比如MIDletMIDletMIDletn这一点非常的重要在部署jar和jad文件到手机的时候一定要确保MIDletName的正确它的值是你的jar包的名字!否则不会安装成功的还有两个值是jad文件中不许有的他们是MIDletJarURL MIDletJarSize 其中应该注意的是MIDletJarURL如果你要是通过OTA下载的话那么你不许让他指向你jar包的绝对地址例如 关于一个MIDlet suite里面有多个MIDlet的情况我写了个简单的代码测试了一下如果还有疑问的话你可以运行一下下面的程序 import javaxmicroeditionlcduiDisplay; import javaxmicroeditionlcduiForm; import javaxmicroeditionmidletMIDlet; import javaxmicroeditionmidletMIDletStateChangeException; /* * Created on * * TODO To change the template for this generated file go to * Window Preferences Java Code Style Code Templates */ /** * @author EC * * TODO To change the template for this generated type comment go to * Window Preferences Java Code Style Code Templates */ public class MIDlet extends MIDlet { private Display display; /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#startApp() */ protected void startApp() throws MIDletStateChangeException { // TODO Autogenerated method stub display = DisplaygetDisplay(this); displaysetCurrent(new Form()); } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#pauseApp() */ protected void pauseApp() { // TODO Autogenerated method stub } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#destroyApp(boolean) */ protected void destroyApp(boolean arg) throws MIDletStateChangeException { // TODO Autogenerated method stub } } import javaxmicroeditionlcduiDisplay; import javaxmicroeditionlcduiForm; import javaxmicroeditionmidletMIDlet; import javaxmicroeditionmidletMIDletStateChangeException; /* * Created on * * TODO To change the template for this generated file go to * Window Preferences Java Code Style Code Templates */ /** * @author EC * * TODO To change the template for this generated type comment go to * Window Preferences Java Code Style Code Templates */ public class MIDlet extends MIDlet { private Display display; /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#startApp() */ protected void startApp() throws MIDletStateChangeException { // TODO Autogenerated method stub display = DisplaygetDisplay(this); displaysetCurrent(new Form()); } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#pauseApp() */ protected void pauseApp() { // TODO Autogenerated method stub } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#destroyApp(boolean) */ protected void destroyApp(boolean arg) throws MIDletStateChangeException { // TODO Autogenerated method stub } } import javaxmicroeditionlcduiDisplay; import javaxmicroeditionlcduiForm; import javaxmicroeditionmidletMIDlet; import javaxmicroeditionmidletMIDletStateChangeException; /* * Created on * * TODO To change the template for this generated file go to * Window Preferences Java Code Style Code Templates */ /** * @author EC * * TODO To change the template for this generated type comment go to * Window Preferences Java Code Style Code Templates */ public class MIDlet extends MIDlet { private Display display; /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#startApp() */ protected void startApp() throws MIDletStateChangeException { // TODO Autogenerated method stub display = DisplaygetDisplay(this); displaysetCurrent(new Form()); } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#pauseApp() */ protected void pauseApp() { // TODO Autogenerated method stub } /* (nonJavadoc) * @see javaxmicroeditionmidletMIDlet#destroyApp(boolean) */ protected void destroyApp(boolean arg) throws MIDletStateChangeException { // TODO Autogenerated method stub } } JAD文件的内容如下 MIDlet: MIDletMIDlet MIDlet: MIDletMIDlet MIDlet: MIDletMIDlet MIDletJarURL: |