格式化

廣告

廣告2

2012年2月12日 星期日

[Android app開發基本概念] Android和J2ME不同之處差異全方位比較

[Android app開發基本概念] Android和J2ME不同之處差異全方位比較



原創文章轉載請註明: Android和J2ME全方位比較 | 流星雪

Android的程式設計語言是Java語言,因此Android和J2ME也應該有很相近的關係。由於之前做過J2ME的開發,因此學習Android感覺不太吃力。下面我將網上資源和自己的體會總結如下,有錯誤歡迎不吝賜教。

一、 程式入口
J2ME程式入口類為MIDlet,所有的J2ME程式都要繼承該類別來初始化J2ME程式;Android程式入口是Activity類。

J2ME MIDlet 生命週期
  1. startApp (活動狀態):程式啟動的時候會呼叫該方法來初始化使用者需要的資源。
  2. pauseApp (暫停狀態):當手機來電的時候,會呼叫該方法將正在做的事情轉到後台暫停。
  3. destroyApp (銷毀狀態):程式退出的時候呼叫。

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:Java的一個微型版本(J2ME),針對行動裝置來開發應用程式的開發包,它必須有底層作業系統的支持,如Sysbian、WinCE等。
  • Android:一個完整的行動裝置作業系統平台,由Linux作業系統、中間件、C類別庫和核心應用程式組成。

三、項目結構
J2ME:
  • src:程式碼
  • res:資源文件
Android:
  • src:程式碼
  • res\drawable:程式圖標
  • res\layout:佈局文件
  • res\values:常量
  • assets:存放一些靜態文件並將會被一起打包成.apk文件
  • gen:存放由Android編譯工具生成的java源文件, 這些文件不能手動修改。如R.java就定義了一些常量,這些常量是對資源文件的索引,以便我們很方便的引用這些資源文件。
  • AndroidManifest.xml:包含應用程式的有關版本、程式信息、java包、程式圖標、程式記錄信息等。

四、顯示元件
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高級UI元件由元件內部刷新實現,低級UI可以通過 Canvas的repain()來刷新。低級UI架構可以用MVC方式來實現,建議使用二級緩存。
Android提供方法onLayout來提供該View調整其裡面元件元素的位置佈局,使用者只需要重寫該方法就可以。刷新方法onDraw,該接 口用來刷新界面裡的繪製元素,該方法類似J2ME Canvas的paint方法。如果是移植的話,建議android也使用二級緩存,這樣程式容易管理。

六、UI
J2ME 中Canvas的repaint()與Android中View的 invalidate()/postInvalidate()方法實現了相同的功能,但是invalidate()/postInvalidate()兩 者卻有著區別:invalidate()只能在UI這個執行緒裡通過呼叫onDraw(Canvas canvas)來update螢幕顯示,而postInvalidate()是要在non-UI執行緒裡做同樣的事情的。這就要求我們做判斷,哪個呼叫是本 執行緒的,這在做多執行緒callback的時候尤為重要。而在J2ME中,不管怎樣直接呼叫repaint()就好了。
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語句。


原創文章轉載請註明: Android和J2ME全方位比較 | 流星雪

沒有留言 :