編輯:高級開發
注意到在Activity的API中有大量的onXXXX形式的函數定義,除了我們前面用到的onCreate以外,還有 onStart,onStop以及onPause等等。從字面上看,它們是一些事件回調,那麼次序又是如何的呢?其實這種事情,自己做個實驗最明白不過了。在做這個實驗之前,我們先得找到在android中的Log是如何輸出的。
顯然,我們要用的是android.util.log類,這個類相當的簡單易用,因為它提供的全是一些靜態方法: 引用:
Log.v(String tag, String msg); //VERBOSE
Log.d(String tag, String msg); //DEBUG
Log.i(String tag, String msg); //INFO
Log.w(String tag, String msg); //WARN
Log.e(String tag, String msg); //ERROR前面的tag是由我們定義的一個標識,一般可以用“類名_方法名“來定義。
輸出的LOG信息,如果用Eclipse+ADT開發,在LogCat中就可以看到,否則用adb logcat也行,不過我是從來都依賴於IDE環境的。
好了,現在我們修改前面的HelloThree代碼: 引用:
public void onStart()
...{
super.onStart();
Log.v(TAG,"onStart");
}
public void onStop()
...{
super.onStop();
Log.v(TAG,"onStop");
}
public void onResume()
...{
super.onResume();
Log.v(TAG,"onResume");
}
public void onRestart()
...{
super.onRestart();
Log.v(TAG,"onReStart");
}
public void onPause()
...{
super.onPause();
Log.v(TAG,"onPause");
}
public void onDestroy()
...{
super.onDestroy();
Log.v(TAG,"onDestroy");
}
public void onFreeze(Bundle outState)
...{
super.onFreeze(outState);
Log.v(TAG,"onFreeze");
}
在HelloThreeB中也同樣增加這樣的代碼,編譯,運行一下,從logcat中分析輸出的日志。
接上頁
在啟動第一個界面Activity One時,它的次序是:
onCreate (ONE) - onStart (ONE) - onResume(ONE)
雖然是第一次啟動,也要走一遍這個resume事件。然後,我們點goto跳到第二個Activity Two中(前一個沒有關閉),這時走的次序是:
onFreeze(ONE) - onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO) - onStop(ONE)
說明,第二個Activity Two在啟動前,One會經歷一個:凍結、暫停的過程,在啟動Two後,One才會被停止?
然後,我們再點back回到第一個界面,這時走的次序是:
onPause(TWO) - onActivityResult(ONE) - onStart(ONE) - onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)
說明,返回時,Two沒有經歷凍結就直接暫停了,在One接收參數,重啟後,Two就停止並被銷毀了。
最後,我們點一下Exit退出應用,它的次序是:
onPause(ONE) - onStop(ONE) - onDestroy(ONE)
說明如果我們用了finish的話,不會有freeze,但是仍會經歷pause - stop才被銷毀。
這裡有點疑問的是:為什麼回來時先是Start才是Restart?可是文檔中的圖上畫的卻是先restart再start的啊?不過,後面的表格中的描述好象是正確的,start後面總是跟著resume(如果是第一次)或者restart(如果原來被stop掉了,這種情況會在start 與resume 中插一個restart)。
下面不跑例子了,看看文檔吧。
1.android用Activity Stack來管理多個Activity,所以呢,同一時刻只會有最頂上的那個Activity是處於active或者running狀態。其它的Activity都被壓在下面了。
2. 如果非活動的Activity仍是可見的(即如果上面壓著的是一個非全屏的Activity或透明的Activity),它是處於paused狀態的。在系統內存不足的情況下,paused狀態的Activity是有可被系統殺掉的。只是不明白,如果它被干掉了,界面上的顯示又會變成什麼模樣?看來下回有必要研究一下這種情況了。
3.幾個事件的配對可以比較清楚地理解它們的關系。Create與Destroy配成一對,叫entrIE lifetime,在創建時分配資源,則在銷毀時釋放資源;往上一點還有Start與Stop一對,叫visible lifetime,表達的是可見與非可見這麼一個過程;最頂上的就是Resume和Pause這一對了,叫foreground lifetime,表達的了是否處於激活狀態的過程。
4.因此,我們實現的Activity派生類,要重載兩個重要的方法:onCreate()進行初始化操作,onPause()保存當前操作的結果。
事半功倍的效果,在一堆同類的軟件中,下載量最大的,一定是讓用戶用著感覺最舒服的,哪怕它的功能並不比其他的產品出色,甚至略差一些。我見過很多開發人員,他們視技術為己任,一
編者按:在人們的印象中,Windows系統通常只是運行於系統顯示“我的電腦”上的磁盤(手機內存)擴展運用:以Windows 98作為例子,在進入到系統後,可以通過添加磁
android系統為研發數據庫的技術人員對Team System承諾,提供相關工具,這樣可以為整個軟件開發周期少了不少彎路,降低工作的復雜性,尤其是智能手機,安裝及使用
支持軟/硬鍵盤輸入基於android平台拼音輸入法支持軟/硬鍵盤輸入,更能夠充分發揮 QWERTY 全鍵盤的打字優勢。同時,基於android平台拼音輸入法桌面產品中的