您好,登錄后才能下訂單哦!
一.Activity進行橫豎屏切換時候的生命周期
1.運行的時候
2.切橫屏(生命周期執行一次)
3.再切豎屏(生命周期執行兩次)
重寫返回按鈕事件public void onBackPressed()此方法當返回按鈕事件出發時,體系會默許調用finish(),你直接return別讓體系調用就行,back鍵后臺參考源碼home的事件并重寫
@Override
public void onBackPressed() {
// 這里處理邏輯代碼,該方法僅適用于2.0或更新版的sdk
return;
}
android的手機的back鍵默認行為是finish(實質就是從Task中將其出棧)處于前臺的Activity的即Activity的狀態為Destroy狀態,再次啟動該Activity是從onCreate開始的。 而Home鍵默認是stop前臺的Activity即狀態為onStop而不是Destroy,若再次啟動它,則是從OnResume開始的,即會保持上次Activityd的狀態。 back鍵也有例外的,按back鍵不會關閉Activity的,比如播放音樂,按了back鍵之后仍可以繼續播放音
按下Back返回鍵
按下Home鍵
按下Home鍵后再次運行改程序
如果將activity的android:configChanges=”orientation|keyboardHidden”屬性設置后
1, 同上1
2,
3,
總結:
1.Activity在進行橫屏切換時會生命周期會執行一次,這個生命周期不是正常所說的連貫的生命周期,會先調用onSaveInstanceState()方法,在這里可以進行Activity的狀態保存,然后是onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()->onRestoreInstanceState()->onRsume();
進行豎屏切換時會調用2次,
2.如果在Manifest.xml中設置了Activity的屬性android:configChanges=”orientation|keyboardHidden”,則進行橫屏切換的時候只會調用一次onConfigurationChanged()方法,豎屏會調用兩次
按下Home鍵,onSaveInstanceState()-> onPause()->onStop();此時運行別的程序,如果沒被收回內存,再運行該程序
onRestart()->onStart()->onResume()
Activity未被完全覆蓋只是失去焦點:onPause--->onResume
二.Activity的狀態保存
方法一:通過onSaveInstanceState() 和onRestoreInstanceState()或onCreate()
Back鍵不會調用onSaveInstanceState,只有在Home鍵,橫豎屏切換和系統收回Activity的時候才會調用,
onSaveInstanceState的調用遵循一個重要原則,即當系統“未經你許可”時銷毀了你的activity,則onSaveInstanceState會被系統調用,這是系統的責任,因為它必須要提供一個機會讓你保存你的數據。至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會因為內存的原因被系統銷毀,故activity A的onRestoreInstanceState方法不會被執
一.關鍵字:通過參數Bundle 來進行存儲
在onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceStae)都可以進行數據的恢復,
從圖中,我們可以看出,onCreate()方法運行在onRestoreInstanceState()方法之前。
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- // TODO Auto-generated method stub
- super.onSaveInstanceState(outState);
- Log.i(TAG, "onSaveInstanceState");
- String content = editText.getText().toString();
- if (null != content) {
- outState.putString(TAG, content);
- }
- }
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onRestoreInstanceState(savedInstanceState);
- Log.i(TAG, "onRestoreInstanceState");
- if(null!=savedInstanceState){
- editText.setText(savedInstanceState.getString(TAG));
- }
- }
方法二:通過 Activity的相應方法,這里選用onPause() 和onResume()
在這里是通過SharedPreference存儲
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onPause");
- String content = editText.getText().toString();
- if (null != content) {
- this.getPreferences(MODE_PRIVATE).edit().putString(TAG, content)
- .commit();
- }
- super.onPause();
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onResume");
- editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG, ""));
- super.onResume();
- }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。