一、當一個在Activity aA啟動另一個Activity aB的時候兩個Activity的回呼函數的調用順序:
1、aA的onPause()被調用;
2、aB的onCreate(),onStart(),onResume()調用依次被調用,此時aB擷取了使用者焦點;
3、這時如果aA如果在螢幕上不可見(aB的介面並不是全螢幕的),那aA的onStop()被調用。
由以上可以引申:如果在aA中修改的資料需要在aB中使用,這時就需要在onPause()中對修改的資料進行儲存到資料庫中(或其他可被兩Activity共用的空間),而不能在onStop()中進行。
二、臨時變數的儲存:
因為當onPause()和onStop()被調用後,有可能因記憶體不足而可被系統銷毀,所以要對一些資料進行儲存,以防止Activity被系統kill掉而丟失:
一些需要儲存到資料庫資料執行儲存,這些資料可以在onCreate()方法中重新從資料庫中載入;
一些不能儲存到資料庫中的資料(資料庫中並沒有為此部份資料設定相應欄位,如僅用於標識當前Activity的狀態資訊的資料)通過onSaveInstanceState(Bundle)來儲存到Bundle中,隨後系統再次進行回退到此Activity的時候,系統會在onCreate(Bundle)中從Bundle中擷取到之前儲存的資料,或者通過onRestoreInstanceState(Bundle)(在onStart()方法後被調用)方法來擷取並設定儲存的資料;
對一些不能用Bundle記錄的資料,可以在Object onRetainNonConfigurationInstance()中進行儲存,並通過getLastNonConfigurationInstance()方法擷取之前函數返回的Object,並根據此Object進行設定(這步還原的操作可在onCreate()和onStart()方法中執行)。
三、onSavdInstanceState(Bundle)與onPause()的調用時機的區別:
1、當因要啟動另一個Activity,當前Activity要失去焦點時,前者先被調用然後是後者;
2、當點擊BACK鍵或調用finish()結束當前Activity時,前者是不會被調用的(調用順序:onPause()->onStop()->onDestory())。
四、Activity的一些配置(如螢幕方向)改變了的時候,系統預設是重新啟動這個Activity,也可以自己處理某些配置改變事件:
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
像上面android:configChanges的配置,當這些配置改變後,系統是不會重新啟動Activity的,這是系統會去調用onConfigurationChanged()方法。
我們就可以自己實現此方法來根據作出相應處理,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();//當然實際的處理應該不是這樣
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
// Checks whether a hardware keyboard is available
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
}
}