MDIP的生命周期
                            
                            
                            MDIP的狀態有三種:paused,active,destroyed
通常的格式如:
public class MyMIDlet extends MIDlet{
?? ?MyMIDlet(){}
?? ?protected void startApp() throws MIDletStateChangedException{}
?? ?protected void pauseApp(){}
?? ?protected void destroyApp(boolean uncoditional) throws MIDletStateChangedException{}
}
各方法的調用情況是:
1.MIDlet被loaded,MIDlet的初始化狀態為paused,此時執行初始化,即運行構造方法。如果在初始化MIDlet時出現任何錯誤的話,MIDlet就直接被置為distroyed狀態了。
2.從paused轉換為active狀態時,設備調用startApp。這個方法名有一定的誤導作用,因為此方法是在paused->active時調用的,而非僅僅在app開始的時候調用。
3.從active->paused時,調用pauseApp方法
4.從active->destroyed或paused->destroyed時,調用distroyed方法
與直覺相違背的是:
1. 通常情況下,大多數初始化工作是放在startApp中完成的,而非構造函數。這主要是因為移動設備的資源性能都有限,因此此種程序開發的一個宗旨是“在 需要用資源的時候申請,用完立刻釋放”。另外,根據MDIP的說明,MIDlet只有在調用startApp的時候才能確保擁有對Display的使用 權,所以在構造函數中對Display做任何操作有可能出現錯誤。
2.前面說過,startApp這個函數不是僅僅在MIDlet start的時候才被調用,而是每次從paused狀態轉換到active狀態時都會被調用,因此startApp的格式通常應該是這樣
protected void startApp() throws MIDletStateChangedException{
?? ?//started is a member of this MIDlet which is boolean with init value false
?? ?if(!started){
?? ??? ?//initialize
?? ??? ?started = true;
?? ?}else{
?? ??? ?//resume from paused state
?? ?}
?? ?
?? ?//the other things
}
3.最重要的在于,MIDlet的狀態轉換不是由程序自身控制的,而是由host platform控制的:
?? ?a.啟動時,調用startApp
?? ?b.暫停時(比如突然進來一個電話,用戶要接),調用pauseApp
?? ?c.恢復暫停時,調用startApp
?? ?d.程序關閉時,調用destroyApp
當然,在程序中控制狀態的轉換也是有辦法的:
?? ?notifyPaused();
?? ?notifyDestroyed();
?? ?resumeRequest();
這 三個函數分別向platform申請active->paused;active/paused->destroyed;paused- >active三種狀態轉換(paused->destroyed的轉換是可能的,因為用戶在暫停了一個程序后,又想關閉它,總不需要再激活 他一下吧)。值得注意的是,在程序中通過這種方式申請狀態轉換時,platform并不會再去調用pauseApp和destroyApp,因為它認為程 序是在準備好了的狀況下才會申請狀態變遷的。三個轉換申請的調用推薦如下格式:
############
pauseApp();
notifyPaused();
############
//destroy后面會具體說明
try{
?? ?destroyApp(false);
?? ?notifyDestroyed();
}catch(MIDletStateChangedException msce){
?? ?//MIDlet don't want to be destroyed
}
############
//resumeRequest的意思是platform在不久后調用startApp,因此不用先做狀態轉換的準備
resumeRequest();
############
還 有一點值得注意的是,由于destroyApp可能在active時被調用,也可能是paused時被調用,有時候有必要檢查一下MIDlet當時的狀 態。destroyApp的作用是釋放MIDlet占有的所有資源,而paused卻要釋放暫時不需要的資源并保存需要的狀態變量,所以在destroy 函數中針對不同狀態做不同的資源釋放有時是很有必要的。
!!關于MIDletStateChangedException
startApp和destroyApp都會拋出這個異常,一一說明如下:
*startApp:
?? ?1.當出現了transient failuer時,即遇到暫時的問題導致startApp運行不下去,它會拋出一個MIDletStateChangedException,然后回到paused狀態,以便下次再startApp;
?? ?2.當出現non-transient failuer時,notifyDestroyed就應該被調用了(后面說明);
?? ?3.當出現了RuntimeException時,MIDlet就立刻被destroyed了——當然destroyApp會被先調用。
*destroyApp:
?? ?destroyApp的作用是釋放所有的資源(包括各個線程)。其參數為true表示無條件釋放(正如其名稱unconditional)。
?? ?1.當platform進行狀態轉換時,unconditional是true;
?? ?2.當MIDlet自身要求進行destroy時——比如響應用戶按下EXIT按鈕事件,建議使用前述的方式:
?? ??? ?try{
?? ??? ??? ?destroyApp(false);
?? ??? ??? ?notifyDestroyed();
?? ??? ?}catch(MIDletStateChangedException msce){
?? ??? ??? ?//MIDlet don't want to be destroyed
?? ??? ?}
?? ?false表示,當釋放資源時遇到了某些不能釋放的東西——比如需要保存的文件——就拋出一個MIDletStateChangedException,以便做相應的處理。顯然,這種方式更加friendly。
?? ?另外,對于MIDlet來說,notifyDestroyed()是唯一可以強行退出程序的方法。調用Syste.exit或Runtime.exit都會拋出SecurityException。
最后需要注意一個細節是:startApp會運行到結束,然后卻不會自動轉入destroyed 或 paused狀態,而是停留在active的狀態——MIDlet程序通常都是事件驅動的,誰也不希望程序在用戶沒有發出退出命令時就自己退了出去。
原文地址:http://www.ulcms.com/html/java/javame/20070927/MDIP_570.htm
 
                        
                        
                        通常的格式如:
public class MyMIDlet extends MIDlet{
?? ?MyMIDlet(){}
?? ?protected void startApp() throws MIDletStateChangedException{}
?? ?protected void pauseApp(){}
?? ?protected void destroyApp(boolean uncoditional) throws MIDletStateChangedException{}
}
各方法的調用情況是:
1.MIDlet被loaded,MIDlet的初始化狀態為paused,此時執行初始化,即運行構造方法。如果在初始化MIDlet時出現任何錯誤的話,MIDlet就直接被置為distroyed狀態了。
2.從paused轉換為active狀態時,設備調用startApp。這個方法名有一定的誤導作用,因為此方法是在paused->active時調用的,而非僅僅在app開始的時候調用。
3.從active->paused時,調用pauseApp方法
4.從active->destroyed或paused->destroyed時,調用distroyed方法
與直覺相違背的是:
1. 通常情況下,大多數初始化工作是放在startApp中完成的,而非構造函數。這主要是因為移動設備的資源性能都有限,因此此種程序開發的一個宗旨是“在 需要用資源的時候申請,用完立刻釋放”。另外,根據MDIP的說明,MIDlet只有在調用startApp的時候才能確保擁有對Display的使用 權,所以在構造函數中對Display做任何操作有可能出現錯誤。
2.前面說過,startApp這個函數不是僅僅在MIDlet start的時候才被調用,而是每次從paused狀態轉換到active狀態時都會被調用,因此startApp的格式通常應該是這樣
protected void startApp() throws MIDletStateChangedException{
?? ?//started is a member of this MIDlet which is boolean with init value false
?? ?if(!started){
?? ??? ?//initialize
?? ??? ?started = true;
?? ?}else{
?? ??? ?//resume from paused state
?? ?}
?? ?
?? ?//the other things
}
3.最重要的在于,MIDlet的狀態轉換不是由程序自身控制的,而是由host platform控制的:
?? ?a.啟動時,調用startApp
?? ?b.暫停時(比如突然進來一個電話,用戶要接),調用pauseApp
?? ?c.恢復暫停時,調用startApp
?? ?d.程序關閉時,調用destroyApp
當然,在程序中控制狀態的轉換也是有辦法的:
?? ?notifyPaused();
?? ?notifyDestroyed();
?? ?resumeRequest();
這 三個函數分別向platform申請active->paused;active/paused->destroyed;paused- >active三種狀態轉換(paused->destroyed的轉換是可能的,因為用戶在暫停了一個程序后,又想關閉它,總不需要再激活 他一下吧)。值得注意的是,在程序中通過這種方式申請狀態轉換時,platform并不會再去調用pauseApp和destroyApp,因為它認為程 序是在準備好了的狀況下才會申請狀態變遷的。三個轉換申請的調用推薦如下格式:
############
pauseApp();
notifyPaused();
############
//destroy后面會具體說明
try{
?? ?destroyApp(false);
?? ?notifyDestroyed();
}catch(MIDletStateChangedException msce){
?? ?//MIDlet don't want to be destroyed
}
############
//resumeRequest的意思是platform在不久后調用startApp,因此不用先做狀態轉換的準備
resumeRequest();
############
還 有一點值得注意的是,由于destroyApp可能在active時被調用,也可能是paused時被調用,有時候有必要檢查一下MIDlet當時的狀 態。destroyApp的作用是釋放MIDlet占有的所有資源,而paused卻要釋放暫時不需要的資源并保存需要的狀態變量,所以在destroy 函數中針對不同狀態做不同的資源釋放有時是很有必要的。
!!關于MIDletStateChangedException
startApp和destroyApp都會拋出這個異常,一一說明如下:
*startApp:
?? ?1.當出現了transient failuer時,即遇到暫時的問題導致startApp運行不下去,它會拋出一個MIDletStateChangedException,然后回到paused狀態,以便下次再startApp;
?? ?2.當出現non-transient failuer時,notifyDestroyed就應該被調用了(后面說明);
?? ?3.當出現了RuntimeException時,MIDlet就立刻被destroyed了——當然destroyApp會被先調用。
*destroyApp:
?? ?destroyApp的作用是釋放所有的資源(包括各個線程)。其參數為true表示無條件釋放(正如其名稱unconditional)。
?? ?1.當platform進行狀態轉換時,unconditional是true;
?? ?2.當MIDlet自身要求進行destroy時——比如響應用戶按下EXIT按鈕事件,建議使用前述的方式:
?? ??? ?try{
?? ??? ??? ?destroyApp(false);
?? ??? ??? ?notifyDestroyed();
?? ??? ?}catch(MIDletStateChangedException msce){
?? ??? ??? ?//MIDlet don't want to be destroyed
?? ??? ?}
?? ?false表示,當釋放資源時遇到了某些不能釋放的東西——比如需要保存的文件——就拋出一個MIDletStateChangedException,以便做相應的處理。顯然,這種方式更加friendly。
?? ?另外,對于MIDlet來說,notifyDestroyed()是唯一可以強行退出程序的方法。調用Syste.exit或Runtime.exit都會拋出SecurityException。
最后需要注意一個細節是:startApp會運行到結束,然后卻不會自動轉入destroyed 或 paused狀態,而是停留在active的狀態——MIDlet程序通常都是事件驅動的,誰也不希望程序在用戶沒有發出退出命令時就自己退了出去。
原文地址:http://www.ulcms.com/html/java/javame/20070927/MDIP_570.htm
轉載于:https://www.cnblogs.com/BoiledWater/archive/2009/08/11/1543505.html
總結
 
                            
                        - 上一篇: 清除开始文档批处理
- 下一篇: 033-Unit 12 Introduc
