手机JAVA编程技术[通俗易懂]

JAVA手机编程技术林天峰(温州职业技术学院计算机系浙江

大家好,又见面了,我是你们的朋友全栈君。

JAVA手机编程技术
林天峰
(温州职业技术学院 计算机系 浙江 温州 325000)

摘 要:简要介绍了SUN公司的J2ME规范,并通过具体例子说明了MIDP程序的设计方法及开发过程。

中图分类号:TP312JA 文献标识码:B 文章编号:1004-373X(2003)09-057-04

1 引 言

随着通讯技术的发展及手机的普及,人们正在不断地给手机增加新的功能,其中,使手机实现一般只有PC机才具有的功能–下载各种程序并运行,是目前手机发展的一个重要方向。为此,人们提出了各种各样的解决方案,其中基于JAVA的J2ME方案无疑是最引人注目的。

JAVA语言由于其平台无关、开放、网络功能强、面向对象、安全等特点,一经SUN公司提出,就随着Internet的发展而风靡全世界,在国外已成为软件开发人员的必修语言。特别是他的”一次编写、到处运行”的跨平台优点,对于手机领域来说更具有重要的意义。因为目前手机的种类繁多,各种厂商都有自己的标准,如何使他们能运行同一种标准的程序成为必须要解决的问题。采用JAVA语言后,各种手机只要实现JAVA虚拟机(JVM)就可以运行JAVA程序,这种方法可以说是目前情况下最为理想的一种解决方案。

J2ME(JAVA 2 Micro Edition)是用于嵌入式系统的JAVA,他是SUN公司对标准的JAVA版本J2SE做了最大程度的精简后得到的一种JAVA应用程序运行环境,在最简单的情况下他只有几十kB,特别适合在手机、PDA等设备中使用。手机厂商如果在自己的手机中实现了J2ME规范,就可以从网络下载并运行JAVA程序,从而大大扩展了手机的功能。鉴于JAVA在Internet上取得的巨大成功,我们有理由相信,J2ME能够把这种成功延伸到手持设备领域,为将来的手机和互联网融为一体提供有利的条件。

JAVA手机的出现也给软件行业提供了新的机遇,能否给JAVA手机提供足够多的软件资源是关系到其能否推广的重要因素之一。本文对J2ME构架做一个简单的介绍,并通过一个具体的程序例子来说明JAVA手机程序的特点及开发过程。

2 J2ME概述

J2ME是一种新的、非常小的JAVA应用程序运行环境,他所定义的构架主要用于在手持式设备上推广使用JAVA技术。SUN公司将为各种硬件规模的设备提供合适的配置,这些配置包括虚拟机、核心类库及API。目前,J2ME定制了2种配置:CLDC(Connected Limited Devices Configuration)和CDC(Connected Device Configuration)。其中,CLDC是为手机等CPU和内存资源远低于标准JAVA要求的设备所提供的一种配置,他是对JAVA标准版本做了最大程度的缩减后得到的,其虚拟机和核心类库多于100kB。CDC配置主要用于拥有更多资源的下一代设备。

CLDC配置给各种手持设备提供了能运行JAVA程序的一种环境,但开发者还很难在这种环境下开发程序,首先因为CLDC核心库提供的是低级API,不适合直接用于构建应用程序;其次,手持设备的系统结构千差万别,很难保证应用程序的图形界面、网络等功能的移植性。因此,为了进一步增强J2ME的功能,SUN公司允许设备供应商在实现CLDC的基础上再为自己的设备提供专门的高级API及程序管理方法,即PROFILE,以简化应用程序的开发,使程序有更好的移植性。同时,SUN公司还与50多家知名的移动设备制造商及软件开发商一起,制订了专门用于手机等移动信息设备的PROFILE–MIDP (MobileInformation Device PrOfile),由于MIDP提供了编写图形界面、网络程序的统一规范,并实现动态、安全的程序管理方法,因此得到了诺基亚、摩托罗拉、西门子等主要手机厂商的支持,纷纷推出了基于MIDP的JAVA手机。

与APPLET相似,MIDP程序也称为MIDlet,他必须要继承一个特定的类–MIDlet,这样MIDlet管理者才能控制他的运行。这个类包含了startApp,pauseApp,destoryApp三个用户可以重载的方法,分别在MIDlet进入运行状态、停止运行、退出时调用。

MIDP程序的图形接口相对于标准JAVA的AWT接口要简单得多,他分为低级API和高级API。低级图形API使开发者能更直接地控制屏幕显示和键盘输入,他基于抽象类Canvas,一般用于编写游戏程序,他的可移植性要由开发者自己保证。高级图形API能在不同设备之间有很好的可移植性,但开发者能调整的余地也相应地很小,他基于抽象类Screen,并有
Alert,Form,List,TextBox四个具体的子类,这4个子类分别表示警示框、表单、列表框、文本输入框。另外,高级API还提供了许多图形组件,包括Command,ChoiceGroup, DateFie1d, Gauge, ImageItem,StingItem,TextField等,他们都可以添加到A1ert和
Form中。有些图形组件还提供了与AWT相似的事件及事件响应处理方式。

MIDP程序一般要和各种资源文件一起压缩成一个jar文件。发布时,还需要有一个扩展名为jad的描述文件,他包含了MIDP程序的名称、版本、jar文件的位置及大小等信息。JAVA手机首先要访问的是描述文件,再根据描述文件的信息把MIDP程序安装到本手机,然后才能运行。

3 开发实例

MIDP程序真实的运行环境是JAVA手机,但他的开发却是在PC机上进行的,因此开发环境一般都提供仿真器对程序进行测试。各种手机厂商都有自己的开发、测试环境,下面介绍的例子程序,是在SUN公司的MIDP实现中调试通过的。

3.1 程序功能

本例子包含2个MIDP程序,第1个程序运行时要求用户输入姓名,并选择性别,然后程序根据性别和当前时间向用户输出一句问候语。第2个程序运行时让用户选择图片名称,然后把这幅图片在屏幕上显示出来。这2个MIDP程序由同一个描述文件描述。

3.2 程序源代码及注释

3.2.1 第1个MIDP程序(samplel.java)
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import java.util.*; 

//任何MIDP程序都要继承MIDlet类, 为了处理按钮命令, 还要实现了CommandListener接口
public class sample1 extends MIDlet implements CommandListener
{

 private TextBox input;  //声明文本输入框
 private Form select;  //声明表单, 用于放置各种图形组件
 private Alert output; //声明警示框
 Command cf1, cf2, ct, ca;  //声明各种命令按钮
 ChoiceGroup sex; //声明选择框
 Display display=null;  //声明屏幕显示对象
 
 public sample1() 
 {

  input =new TextBox(“请输入您的姓名:”, null, 8, TextField.ANY);  //创建文本输入框
  ct=new Command(“OK”, Command.SCREEN, 1); //创建按钮ct
  input.addCommand(ct);  //把按钮加到文本输入框
  input.setCommandListener(this); //设置按钮事件处理类
  select=new Form(“请选择性别:”);  //创建表单
  String[]str={“男”, “女”};
  sex=new ChoiceGroup(null, ChoiceGroup.EXCLUSIVE, str,null); 
  //创建单选框,
  select.append(sex); //把单选择框加入表单
  cf1=new Command(“OK”, Command.SCREEN, 1);
  //创建2个按钮cf1和cf2
  cf2=new Command(“回退”, Command.BACK, 2);
  select.addCommand(cf1);  //把2个按钮加到表单
  select.addCommand(cf2);
  select.setCommandListener(this); //设置按钮事件处理类
  output=new Alert(“问候; “, “您好1”, null, null);//创建警示框
  output.setTimeout(Alert.FOREVER); //设置超时为永远
  ca=new Command(“退出”, Command.EXIT, 1); //创建按钮ca
  output.addCommand(ca); //把按钮ca加到警示框
  output.setCommandListener(this);  //设置按钮事件处理类
 }

 public void startApp() //该方法在该MIDlet得到执行权时调用
 {

  if(display==null)
   display=Display.getDisplay(this);
  //从系统得到这个MIDlet的屏幕显示对象
  display.setCurrent(input); //把文本输入框input显示在屏幕
 }
 public void pauseApp() {}//该方法在该MIDlet失去执行权时调用
 public void destroyApp(boolean unconditional)//该方法在该MIDlet退出时调用
 {

  input=null; output=null;select=null;
 }
 //commandAction方法是CommandListener接口中定义的按钮事件处理方法
 public void commandAction(Command c,Displayable d)
 {

  if(c==ct) //如果按了ct按钮
  display.setCurrent(select); //则把表单select显示在屏幕
  if(c==cf1)
  { //如果按了cfl按钮
   Calendar rightNow = Calendar.getInstance();//得到当前时间
   int ti=rightNow.get(Calendar.HOUR_OF_DAY);
   //得到当前时间的小时数(24小时制)
   int indx=sex.getSelectedIndex();
   //得到用户在单选框中所选的项目号
   String helo= null;
   String name=input.getString();
   //得到用户在文本框中输入的字符串
   //以下4句根据ti和indx的值构建不同的字符串helo
   if(ti>=12&&indx==1)helo=”上午好!”+name+”小姐”;
   if(ti>=12&&indx==0) helo=”上午好!”+name+”先生”;
   if(ti<12&&indx==1) helo=”下午好!”+name+”小姐”;
   if(ti<12&&indx==0) helo=”下午好!”+name+”先生”;
   output.setString(helo);//在警示框中加入字符串helo
   display.setCurrent(output); //把警示框output显示在屏幕
  }
  if(c==cf2) //如果按了cf2按钮
   display.setCurrent(input);//则把把文本输入框input显示在屏幕
  if(c==ca)
  { //A0果按了ca按钮, 则调用destroyApp方法退出
   destroyApp(true);
   notifyDestroyed();
  }
 }
}

3.2.2 第2个MIDP程序(sample2.java)

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class sample2 extends MIDlet implements CommandListener
{

 private Form form;
 private List ls; //声明列表框
 Command cl=null;
 Display display=null;
 String[]dd={“图像1″,”图像2″,”图象3”};
 public sample2()
 {

  ls=new List(“Test List”,Choice.EXCLUSIVE,dd,null);
  cl=new Command(“OK”,Command.SCREEN,1);
  ls.addCommand(cl);
  ls.setCommandListener(this);
 }
 public void startApp()
 {

  display=Display.getDisplay(this);
  display.setCurrent(ls);
 }
 public void pauseApp() {}
 public void destroyApp(boolean unconditional)
 {
  ls=null; }
  public void commandAction(Command c,Displayable d)
  {
   Image aa=null; //声明图像对象aa
   if(c==cl)
   {
    //用户按了cl按钮
    int i=ls.getSelectedIndex();
    //得到用户在列表框中所选的项目号
    try{

      //创建图象对象,图象文件为tl.png,t2.png或t3.png,要和类一起压缩在jar包中
      aa=Image.createImage(“/t”+(new Integer(i+1)).toString()+”.png”);
   }
   catch(Exception e){}
   Form f=new Form(“Test”); //创建表单f
   f.append(aa); //在表单中加入图像
   display.setCurrent(f);//把表单显示在屏幕上
  }

 }
}

 

3.2.3 描述文件内容(sample.jad)

 

MIDlet-1;Hello,,samplel
//声明第1个MIDlet程序,显示名为Hello,类名为samplel
MIDlet-2:Image,,sample2
//声明第2个MIDlet程序,显示名为Image,类名为sample2
MIDlet-Description:Sample application
//对MIDlet的描绘
MIDlet-Jar-Size:11640
//Jar包的字节数,要根据实际情况修改
MIDlet-Jar-URL:sample.jar
//Jar包的位置及名字,位置省略时表示与jad文件在同一位置
MIDlet-Name:MySamples
//MIDlet的名字
MIDlet-Vendor:Sun Microsystems
//供应商名字
MIDlet-Version:1.0
//MIDlet版本
3.3 开发过程(WindOWS 2000平台下)

(1)从SUN公司的网站下载MIDP2.0版(http:

va.sun.com/prOducts/midp),并解压到c:\midp2.0fcs

(2)从SUN公司的网站下载JAVA标准版开发工具JDKl.3.1,安装在c:\jdkl.3

(3)建一工作目录,并把上述3个文件存人该目录

(4)另外再找3个图像文件,转化为png格式后以

tl.png,t2.png,t3.png的名字存入工作目录

(5)进入MS-DOS方式,转入工作目录,设置以下环境变量:

set MIDP_HOME=c:/xmidp2.Ofcs

set PATH=c:/jdkl.3\bin;c:/midp2.Ofcs\bin

set classpath=c:/midp2.Ofcs\classes

(6)编译2个JAVA文件:

javac *.java

(7)用以下命令预先检查2个类:

preverify  -d  .sample1

preverify  -d .sample2

(8)把有关文件打成1个包:

jar-CVf sample.jar   *.pag

(9)在仿真器中运行:

midp-Classpath.sample.jar    -descriptor sample.jad

在完成仿真后,可以把sample.jadd和sample.jad放在某一网站,并用以下命令测试:

midp-install http://<网络地址及路径>/sample.jad

//下载并安装

midp-run 1 //运行,1表示所安装的第1个MIDlet

注:①网站的Web服务器要把jadd文件的MIME类型设为text/Vnd.sun.j2me.app-descriptor,jar文件的MIME类型设为applicatiOn/java-archive;

②若sample.jad和sample.jar放在不同位置,则sample.jad中的MIDlet-Jar-URL属性要相应修改;

③可以输入midp命令,然后用图形界面进行操作。

4 结 语

MIDP API还提供了HttpConnection类,利用他可以很方便地与互联网的网站进行交互,从而编写出功能很强的网络程序。随着JAVA手机的普及,迫切需要大量的应用程序资源,各大手机厂商也给开发者提供了非常方便的开发工具,相信MIDP程序的开发在不久的将来能很快地流行起来。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128384.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Git拉取代码报密码错误「建议收藏」

    Git拉取代码报密码错误「建议收藏」刚刚Git拉取代码,显示密码错误。我就奇怪了,密码输入了好几次,还是错误。但是马上得提交了,又很着急 ,将最简单的处理 方法忘记了。冷静下来,细细分析。刚学习时好像遇到过此类问题,于是直接删除凭证,再次拉取,正常。真的越着急越乱,遇到问题还是要冷静分析。…

  • Java中八大基本数据类型详解[通俗易懂]

    Java中八大基本数据类型详解[通俗易懂]自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte,short,int,long,char,float,double,boolean.当然围绕着这些基本数据类型衍生出来了很多面试题,但是说实话,工作中基本用不到

  • 【SpringBoot】33、SpringBoot+LayUI后台管理系统开发脚手架[通俗易懂]

    【SpringBoot】33、SpringBoot+LayUI后台管理系统开发脚手架[通俗易懂]本期给大家推荐我自己写一个开源项目:springboot-mini,本着减少大量重复开发工作的原则,使得在项目中能够实现快速开发1、前言本项目本着避免重复造轮子的原则,建立一套快速开发JavaWEB项目(springboot-mini),能满足大部分后台管理系统基础开发功能,使得开发人员直接可从业务模块开始,减少大量的重复开发工作。前端框架使用layui-mini(https://gitee.com/zhongshaofa/layuimini)2、项目地址https://gitee.com/asu

  • 利用js给datalist或select动态添加option选项

    利用js给datalist或select动态添加option选项

  • ios touchesBegan不触发

    ios touchesBegan不触发iostouchesBegan不触发今天简单写了一个touchesBegan,发现无法触发,点击无效,网上找了半天没有效果。最终发现问题是uiimageview需要开启交互:

  • matlab latex换行,Latex 公式中换行问题

    matlab latex换行,Latex 公式中换行问题问题一、对于两个公式,只要一个编号(相当于一个公式分两行排列)解决方案有两种:(一)\begin{equation}\begin{split}(a+b)^2&=a^2+b^2+2ab\\(a+b+c)^2&=a^2+b^2+c^2+2ab+2ac+2bc\end{split}\end{equation}(二)\begin{equation}\begin{aligned}c^{j…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号