J2ME與Android比較 - [手機開發]

來源:互聯網
上載者:User

 

一、 程式入口
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語句。

本文出自“simayilong”
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.