`
kalogen
  • 浏览: 880111 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

J2ME与Android系统的常用类、方法对比

 
阅读更多

J2MEAndroid系统的常用类、方法对比

 

J2ME系统

Android系统

入口程序

MIDlet

Activity

图片类

Image

Image.createImage(path);

BitMap

BitmapFactory.decodeResource(getResources(),R.drawable.map0);

画笔

Graphics

Canvas

绘画

Displayable

View

按键

keyPressed()

keyRepeated()

keyReleased()

onKeyDown()

onKeyUp()

onTracKballEvent()

触笔

pointerPressed(),

pointerReleased(),

pointerDragged()

onTouchEvent()

打印信息

System.out.printlt()

Log

生命周期-开始

startApp(),活动状态,启动时调用,初始化。

onCreate(),返回时也会调用此方法。

onCreate()后调用onStart()

onStart()后调用onResume()

生命周期-暂停

PauseApp(),暂停状态,如来电时,调用该接口。

onPause()

生命周期-销毁

destroyApp(),销毁状态,退出时调用。

onStop(),程序不可见时调用onDestroy(),程序销毁时调用

刷新

高级UI组件由内部刷新实现。

低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环

高级UIHandler类通过消息的机制刷新

onDraw()刷新接口

低级UI开发者用线程控制更新,在lockCanvas()unlockCanvasAndPost()方法之间绘制

数据存储

Record Management System (RMS)

SQLite数据库

SharedPreferences

可绘区域

int clipX = g.getClipX(); 

int clipY = g.getClipY(); 

int clipW = g.getClipWidth(); 

int clipH = g.getClipHeight(); 

g.clipRect(x, y, width, height); 

g.setClip(clipX, clipY, clipW, clipH);

canvas.save();

canvas.clipRect(x,y,x+width, y+height); 

cavnas.resave();

游戏中清屏

paint.setStyle(Style.FILL);

canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);

canvas.drawColor(Color.BLACK);

游戏开发包

javax.microedition.lcdui.game

GameCanvas

Layer

LayerManager

Sprite

TiledLayer

无专门针对游戏的开发包,可以直接拿来主义,将J2ME的开发包稍作修改

音效

Player s =Manager.createPlayer(InputStream);

s.prepare(); //创建

s.start();//播放

s.stop();//暂停

s.stop();//关闭

s.release();//释放  

MediaPlayer类处理背景音乐

SoundPool类处理一些简单的音效

全屏

CanvasSetFullScreenMode()

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

requestWindowFeature(Window.FEATURE_NO_TITLE);

获得屏幕尺寸

Canvas类的getHeight()getWidth()

Display d = getWindowManager().getDefaultDisplay();

 screenWidth = d.getWidth();

 screenHeight = d.getHeight();

双缓冲

Image bufImage=Image.createImage(bufWidth, bufHeight);

Graphics bufGraphics=bufImage.getGraphics();

Bitmap carBuffer = Bitmap.createBitmap(bufWidth, bufHeight, Bitmap.Config.ARGB_4444); 

Canvas carGp = new Canvas(carBuffer);

 

 

 

 

 

      
一、 程序入口
J2me程序入口类为MIDlet,所有的j2me程序都要继承该类来初始化j2me程序。Android程序入口是Activity类。下面先看看它们的生命周期。

J2me MIDlet生命周期
1、 startApp (活动状态)程序启动的时候会调用该方法来初始化用户需要的资源。
2、 PauseApp (暂停状态)当手机来电接电话的时候,会调用该接口。用户可以调用该接口停止也写线程的操作。
3、 destroyApp (销毁状态)程序退出的时候调用。用户可以调用该接口处理处于活动状态的线程。
该几个周期状态有AMS调用转换,也可以程序代码调用转换。resumeRequest调用会的结果是AMS会调用startApp方法,notifyPaused调用的结果是可能AMS调用PsuseApp,notifyDestroyed调用会使AMS销毁该midlet。

Android Activity生命周期
1、 onCreate 程序开始初始化的时候调用该接口,用户导航返回到Activity的时候也会调用该接口。类似于J2me里面多个Canvase(Displayable)切换。所以Activity也类似于Displayable。
2、 onStart onCreate调用完后,程序调用该接口。
3、 onResume onStart调用后调用该接口。此时Activity进入运行状态。
4、 onPause 新的Activity启动的时候调用该接口。
5、 onStop 该Activity 不可见的时候调用。
6、 onDestroy 程序销毁的时候调用。

二、显示组件
J2me 中所有可显示的组件都是直接或间接的继承了Displayable,直接的是Canvas和Screen。不同的继承导致了低级UI和高级UI的区别。 J2me中现成的UI组件都是直接或者间接继承了Screen。只要调用Display.getDisplay(MIDLet instan).setCurrrent(Displayable disp),就可以把组件显示到手机界面上。切换界面的时候也可以使用该接口。

Android 可见的组件直接或者间接继承了android.view.View。通过Activity.setContentView(View view)就可以显示在android手机界面上,切换界面的时候也可以使用该接口。如果是直接继承了View而不是Android自带的UI组件,那么还要自己去实现它的刷新,类似J2me的低级UI组件。

三、UI
J2me高级UI组件由组件内部刷新实现,低级UI可以通过 Canvas的repain()来刷新。低级UI架构可以用MVC方式来实现,建议使用二级缓存。Android提供接口onLayout来提供该 View调整其里面组件元素的位置布局,用户只需要重写该接口就ok。刷新接口onDraw,该接口用来刷新界面里面的绘制元素。该接口类似j2me Canvas的paint接口。不过两个平台传得参数有些意思。J2me传的时Graphics,而android传得是Canvas。Android绘制的时候会传入一个参数Paint。该对象表示绘制的风格,比如颜色,字体大小,字体格式等。如果是移植的话,建议android也使用二级缓存,这样也容易管理。

如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的 invalidate()/postInvalidate()方法实现了相同的功能,但是invalidate()/postInvalidate()两者却有着区别:invalidate()只能在UI这个线程里通过调用onDraw(Canvas canvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了。

另外,Android的View类的显示很大程度上是从XML中读取的,包括了它的layout与很多属性,至于怎么读的以后再谈。而Canvas只需要 Custom Draw就可以了,而且Canvas不能设置大小(那个fullScreenMode免谈),但是View可以。

View 的构造函数,我们不需要再Activity中调用,但是Displayable的是必须的。在Activity中,我们要通过findViewById来从XML中取得View,然后强制转换成View的子类型即可,而J2ME的Canvas是一定要构造出来的。

也许在UI的应用上,Android比J2ME强大的地方,就在于它的View有很多定义好的子类能让我们调用,很方便,也很漂亮。因为Android开源,将来普及之后一定会有很多第三方的控件能为我们所用,这才是大大拓展了Android之处。这会把我们从那些graphics.drawXXX函数中解放出来,也能让我们的应用程序变得更酷更炫。

四、用户事件处理
在J2ME下,Canvas可以响应按键事件与触摸屏事件,它封装了六个 protected的方法,响应六种不同的事件:keyPressed(int keyCode)用于响应按键压下、keyReleased(int keyCode)用于响应按键释放、keyRepeated(int keyCode)用于响应按键长时间压下不释放;pointerDragged(int x,int y)用于响应触摸屏拖拽、pointerPressed(int x,int y)用于响应触摸屏点击、pointerReleased(int x,int y)用于响应触摸屏释放。其中参数方面,keyCode告诉我们哪个按键触发的事件,x、y分别告诉我们触摸屏被点击的坐标(绝对位置)。

在 Android下,View同样可以响应以上两种事件,分别有:boolean onKeyDown(int keyCode,KeyEvent event)用于响应按键点击、boolean onKeyMultiple(int keyCode, int repeatCount,KeyEvent event)用于响应按键重复点击、boolean onKeyUp(int keyCode,KeyEvent event)用于响应按键释放以及onTouchEvent(MotionEvent event)用于响应触摸屏事件。官方API指出onKeyMultiple方法总是返回false的,即它没有handle,因此必须重写才能实现。

在键盘事件方面,J2ME与Android的区别在于Android中定义了KeyEvent这个类,用于描述按键事件。这个KeyEvent可不简单,它能够将一个按键事件描述的淋漓尽致。它的getAction()方法,可以得到按键的行为(down、up or multiple);它的getDownTime()可以得到最近一次keyDown事件发生的时间;它的getEventTime()可以得到本次事件发生的时间;它的getRepeatCount() 可以得到同一按键被连续点击的次数(这个很大程度上是为onKeyMultiple方法设计的)。有一点是非常需要注意的,Android底层在触发 keyDown事件时,有一点与J2ME很不一样:比如我们按下一个键但不释放,J2ME只触发一次keyDown事件由keyPressed()执行,然后就交给keyRepeated()处理,然而Android是每隔一段时间(几十毫秒)就触发一次,onKeyDown方法会连续响应事件,造成意想不到的事情。想解决这个问题倒也不难,你可以通过getAction判断这次事件是否是keyDown,如果是的话,用getEventTime()减去 getDownTime(),如果这个数值太小,可以选择不响应。这个方法简单,但是如果用户输入太快,真正的输入也可能被忽略掉,所以还有另外一种方法:维护一个堆栈,在重写onKeyDown()与onKeyUp()方法的时候,如果getAction()是keyDown,就入栈,如果是 keyUp,就出栈,如果得到一个事件,当它是keyDown的时候,如果当前栈顶是keyDown,就选择性不响应这个事件,这样的话,长点击就相当于一次点击。其实有一些view的子类,比如Button加入了onLongClick()的处理方法这样即使你用选中这个view,长时间按下选择键,也可以相应的处理。

在触摸屏方面,Android只有onTouchEvent()来处理,但是由于它的参数中有 MotionEvent,所以J2ME下分开的三种事件可以通过MotionEvent的getAction()方法加以区分。比较有意思的是 MotionEvent中有一个getPressure()方法,能够得到点击的压力,看来Android手机的元件精密程度很高,乃至软件可以得到压力的大小并通过它来做一些逻辑。

还有一点,Android的KeyEvent与MotionEvent是可以自己构造的,KeyEvent可以通过dispatch()方法将自己传递给KeyEvent的Callback,即事件响应处理方法,这样就能让我们做一个软键盘出来,也可以做许多别的事情。

五、数据库
它们的区别在于android的sqlite很容易建立表到表之前的关联,而J2ME必须实现自己的一套框架,而且ANDROID的sqlite提供一些接口(如:SQLiteOpenHelper),数据库开发会很容易, J2ME可以看成在一个文件读写一些序列化的东西,而android只要会一些sql语句。

分享到:
评论

相关推荐

    j2me移植Android引擎

    J2ME是Java平台的一个子集,主要用于移动设备和嵌入式系统,而Android则是一个开源的操作系统,主要应用于智能手机和平板电脑。在移动开发领域,随着Android的普及,很多J2ME开发者有需求将已有的J2ME应用移植到...

    开发中j2me与android的对比

    屏幕绘制,J2ME使用Paint方法,Android则重写onDraw方法。在处理图像时,J2ME的Image.createImage用于创建图像,Android则使用BitmapFactory.decodeResource。字体操作在J2ME中相对简单,而在Android中,需要更多...

    j2me_android_sdk1.16

    7. **用户界面适配**:Android与J2ME的用户界面设计原则不同,因此可能需要调整UI布局和交互方式,以符合Android的设计规范和用户体验标准。 总之,"j2me_android_sdk1.16"为开发者提供了一种有效途径,将他们的...

    快速转化J2ME程序为Android程序

    总的来说,J2MEBuilder提供了一种快速将J2ME应用转换为Android APK的方法,降低了迁移成本,使得开发者可以充分利用J2ME的已有资源,为Android用户提供服务。然而,开发者仍需对J2ME和Android平台的差异有所了解,...

    j2me移植到android的代码封装

    在移动开发领域,Java 2 Micro Edition(J2ME)曾是开发小型设备应用程序的主流平台,而Android现已成为智能手机和平板电脑的主要操作系统。当需要将J2ME应用移植到Android时,会遇到一些兼容性问题,因为两者的核心...

    j2me移植android

    然而,随着智能手机的普及,Android成为了主流的操作系统,许多开发者和用户开始寻找将J2ME应用移植到Android平台的方法。本文将详细介绍J2ME应用移植到Android的步骤、挑战以及解决方案。 首先,理解两者之间的...

    J2ME,J2EE与Android开发学习资料

    Java技术在移动和企业应用开发领域占据着重要地位,其中J2ME、J2EE和Android是三个关键的分支。...通过不断的学习和实践,你将能够独立开发出高质量的J2ME应用、高效的企业级J2EE系统以及富有用户体验的Android应用。

    j2me_android_sdk_1.0

    Android下实现的J2ME API类库,使用此SDK可以无缝将你J2ME APP移植成android APP, 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API 20111204更新新版: 1 JAD.MF文件:增加屏幕方向设置 2 JAD.MF文件:增加游戏专用摇杆...

    开发中j2me与android的比较.pdf

    ### 开发中J2ME与Android的比较 随着移动设备技术的发展,移动应用开发成为软件工程领域中的一个重要分支。在过去的几十年里,多种移动开发平台和技术相继涌现,其中包括Java 2 Micro Edition (J2ME) 和 Android。...

    j2me2android

    5. **性能优化**:考虑到Android设备的硬件特性与J2ME设备可能存在差异,项目可能包含性能优化策略,以确保转换后应用的流畅运行。 6. **示例应用**:"Meteoroid"可能是一个示例应用,用于展示如何使用"j2me2...

    J2ME游戏移植到Android手机

    - **绘图**:J2ME的Graphics类与Android的Canvas类类似,但Android提供了更丰富的绘图API,如Paint类。 - **事件处理**:J2ME的键盘事件通过keyPressed、keyRepeated和keyReleased方法处理,Android则使用...

    可以用于j2me或android中的GZIP压缩源代码

    在IT行业中,压缩技术是数据传输和存储领域的重要部分,特别是在资源有限的移动平台如J2ME(Java 2 Micro Edition)和Android上。GZIP是一种广泛使用的数据压缩格式,它基于DEFLATE算法,可以有效地减少文件大小,...

    获取J2ME平台手机系统属性

    其次,J2ME的` javax.microedition.io.Connector `类提供了`openDataInputStream()`和`openDataOutputStream()`方法,用于打开与特定URL的连接,从而获取更详细的设备信息。例如,可以通过HTTP GET请求获取设备的...

    j2me_android_sdk_1.1.3

    20120105:更新至1.13版本 1修改音频播放处理,支持同时播放多个音频【同时播放的音频文件大小需要】 2优化Canvas实现,避免频繁创建Canvas对象会内存溢出BUG 3增加Player对PlayerListener实现

    J2ME文件管理系统

    J2ME中的文件系统基于Java的`java.io`包,提供了一系列类和接口来处理文件操作。主要涉及以下几个关键类: - `File`: 表示文件或目录的抽象路径名。可以用来创建、删除、重命名文件或目录,以及获取文件属性。 - `...

    J2ME游戏移植Android平台要点

    5. **UI设计**:Android的设计规范和用户交互模式与J2ME不同,需要对界面进行调整以符合Android用户体验标准。 6. **服务和权限**:Android应用程序可能需要请求权限才能访问某些服务,如网络、多媒体文件等,这在...

    j2me移植到android 代码替换开发包 移植利器(版权持有)

    j2me移植到android 代码替换开发包:替换j2me平台的Graphics ,Image ,HttpConntion,RecordStore,Player,Connector,Font,Canvas...

    J2ME游戏如何移植成android

    J2ME是一个Java ME平台,主要用于开发移动设备应用程序,而Android是一个基于Linux的移动操作系统。虽然两者都是基于Java的,但它们有着不同的架构和设计理念。 在移植J2ME游戏到Android平台时,需要注意以下几点:...

    j2me移植到Android(Ophone)-游戏文档

    目前大多数的手机游戏还是以J2ME平台为主,而OPhone做为一个后起之秀、一个新的手机操作系统,目前上面的软件和游戏还不是很多,但是它有一个很大的优点——也是基于JAVA语言开发。有了这个优点也就意味着所有的J2ME...

Global site tag (gtag.js) - Google Analytics