Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> J2ME與Android程序部分比較

J2ME與Android程序部分比較

編輯:初級開發

一、程序入口    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組件。    三、刷新處理    J2me刷新:    J2me高級UI組件由組件內部刷新實現,低級UI可以通過Canvas的repain()來刷新。低級UI架構可以用MVC方式來實現,建議使用二級緩存。    Android刷新:    Android提供接口onLayout來提供該VIEw調整其裡面組件元素的位置布局,用戶只需要重寫該接口就ok。刷新接口 onDraw,該接口用來刷新界面裡面的繪制元素。該接口類似j2me Canvas的paint接口。不過兩個平台傳得參數有些意思。J2me傳的時Graphics,而android傳得是Canvas。Android繪制的時候會傳入一個參數Paint。該對象表示繪制的風格,比如顏色,字體大小,字體格式等。如果是移植的話,建議android也使用二級緩存,這樣也容易管理。    四、用戶事件處理    J2ME的鍵盤、觸筆事件都是通過Canvas定義接口分發。用戶只需要從寫這些接口就ok。它們分別是。鍵盤接口為:keyPressed(),keyRepeated(),keyReleased()。觸筆接口為:pointerPressed(),pointerReleased(),pointerDragged()。    android的鍵盤,觸筆通過VIEw中定義,只要override其接口就ok了。觸筆處理接口onTouchEvent。軟鍵盤 onKeyDown()、onKeyUp()、onTracKballEvent()。
記得馮・諾依曼大神曾經對我們這些後輩說過,計算機是由運算器、控制器、存儲器、輸入設備和輸出設備五大部分組成的。我們看看現如今的手機(mobile device),可以看到前面所述五大部分一樣不少,這就是所謂的麻雀雖小,五髒俱全。但是由於設備的限制,手機在輸入、輸出設備上有很大的限制,在今天要談到的用戶輸入響應上,於是就只由兩種了,一個是手機按鍵,另一個是觸摸屏。在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,即事件響應處理方法,這樣就能讓我們做一個軟鍵盤出來(乍看起來比做Windows軟鍵盤簡單,其實也並不容易,要是把它作為一個Activity跑得話,焦點問題還很麻煩),也可以做許多別的事情,這一點J2ME好像沒有做到。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved