1.4Activity保存现场状态
概念:
保存Activity的狀態是非常重要的,例如我們在玩一個游戲的時候,突然來了一個電話,這個時候在接聽完電話之后我們返回到游戲中,這個時候我們希望游戲還是之前那個進度,或者說發生突發事件,游戲這個應用程序被關閉了,這個時候我們如果再重新打開游戲的話,我們如果還是希望回到之前的進度,我們就需要將其狀態保存起來,這樣在Activity的摧毀時,我們還能夠根據保存的狀態回到之前的進度。這就是Activity的狀態保存。
?
生命圖:
?
一般來說, 調用onPause()和onStop()方法后的activity實例仍然存在于內存中, activity的所有信息和狀態數據不會消失, 當activity重新回到前臺之后, 所有的改變都會得到保留.?
但是當系統內存不足時, 調用onPause()和onStop()方法后的activity可能會被系統摧毀, 此時內存中就不會存有該activity的實例對象了. 如果之后這個activity重新回到前臺, 之前所作的改變就會消失. 為了避免此種情況的發生, 開發者可以覆寫onSaveInstanceState()方法. onSaveInstanceState()方法接受一個Bundle類型的參數, 開發者可以將狀態數據存儲到這個Bundle對象中, 這樣即使activity被系統摧毀, 當用戶重新啟動這個activity而調用它的onCreate()方法時, 上述的Bundle對象會作為實參傳遞給onCreate()方法, 開發者可以從Bundle對象中取出保存的數據, 然后利用這些數據將activity恢復到被摧毀之前的狀態.
需要注意的是, onSaveInstanceState()方法并不是一定會被調用的, 因為有些場景是不需要保存狀態數據的. 比如用戶按下BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數據以供下次恢復的, 也就是onSaveInstanceState()方法不會被調用. 如果調用onSaveInstanceState()方法, 調用將發生在onPause()或onStop()方法之前,所以我們在onSaveInstanceState() 方法中只能用來保存我們的Activity的臨時的狀態信息,而對于要持久化保存的對象或狀態,我們應該在 onPause() 方法中來做。
?
界面:
?
代碼:
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "logmain";private Button button;private EditText name;private CheckBox soccer;private CheckBox basketball;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);name = (EditText) this.findViewById(R.id.editText);soccer = (CheckBox) this.findViewById(R.id.cbsoccer);basketball = (CheckBox) this.findViewById(R.id.cbbasketball);button = (Button) this.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent i = new Intent(MainActivity.this, NextActivity.class);startActivity(i);}});//通過onCreate取值if (savedInstanceState != null) {String s = savedInstanceState.getString("name");boolean cbsoccer = savedInstanceState.getBoolean("soccer");boolean cbbasketball = savedInstanceState.getBoolean("basketball");//測試1/* name.setText("oncreatename");soccer.setChecked(true);basketball.setChecked(false);*///賦值1 name.setText(s);soccer.setChecked(cbsoccer);basketball.setChecked(cbbasketball);}Log.i(TAG, "---Main onCreate---");}@Overrideprotected void onStart() {super.onStart();Log.i(TAG, "---Main onStart---");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {//調用activity的onRestoreInstanceState得到保存的值//如果賦值1注釋了 測試1開放 再把 super.onRestoreInstanceState(savedInstanceState)和通過onRestoreInstanceState取值注釋//旋轉屏幕就是測試1的值super.onRestoreInstanceState(savedInstanceState);//通過onRestoreInstanceState取值/*if (savedInstanceState != null) {String s = savedInstanceState.getString("name");boolean cbsoccer = savedInstanceState.getBoolean("soccer");boolean cbbasketball = savedInstanceState.getBoolean("basketball");//測試2//name.setText("onrestorename");//soccer.setChecked(false);//basketball.setChecked(true);//賦值2name.setText(s);soccer.setChecked(cbsoccer);basketball.setChecked(cbbasketball);}*/Log.i(TAG, "---Main onRestoreInstanceState---");}@Overrideprotected void onResume() {super.onResume();Log.i(TAG, "---Main onResume---");}@Overrideprotected void onPause() {super.onPause();Log.i(TAG, "---Main onPause---");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//通過onSaveInstanceState存值outState.putString("name", name.getText().toString().trim());outState.putBoolean("soccer", soccer.isChecked());outState.putBoolean("basketball", basketball.isChecked());Log.i(TAG, "---Main onSaveInstanceState---");}@Overrideprotected void onStop() {super.onStop();Log.i(TAG, "---Main onStop---");}@Overrideprotected void onRestart() {super.onRestart();Log.i(TAG, "---Main onRestart---");}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TAG, "---Main onDestroy---");}}?
布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.liang.activitydemo.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:attr/textAppearanceMedium"android:text="Name:"android:id="@+id/tvok"android:layout_alignParentTop="true"android:layout_alignParentStart="true" /><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPersonName"android:ems="10"android:id="@+id/editText"android:layout_alignParentTop="true"android:layout_toEndOf="@+id/tvok" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:attr/textAppearanceMedium"android:text="Hobby:"android:id="@+id/tvhobby"android:layout_below="@+id/editText"android:layout_alignParentStart="true" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Soccer"android:id="@+id/cbsoccer"android:layout_below="@+id/editText"android:layout_toEndOf="@+id/tvhobby"android:checked="false" /><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Basketball"android:id="@+id/cbbasketball"android:layout_below="@+id/editText"android:layout_toEndOf="@+id/cbsoccer"android:checked="false" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Next"android:id="@+id/button"android:layout_below="@+id/cbsoccer"android:layout_alignParentStart="true" /></RelativeLayout>?
測試:注意順序
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onPause---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onSaveInstanceState---(存值)
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onStop---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onDestroy---
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onCreate---(取值方法1)
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onStart---
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onRestoreInstanceState---(取值方法2)
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onResume---
轉載于:https://www.cnblogs.com/manusas/p/5519644.html
總結
以上是生活随笔為你收集整理的1.4Activity保存现场状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核中的循环缓冲区
- 下一篇: 诺威达刷机教程_诺威达方案导航一体机