一个Android项目程序一定会存在多个 Activity ,在Activity对象的切换过程中,难免会有一些Activity对象被系统回收,那么,这个Activity中的数据也会消失,打个比方:一个Activity中存在一个EditText输入框,输入到一半的时候跳出另一个界面,而不巧的是这个存在EditText的界面刚好被系统回收了。那么再次启动这个Activity的时候EditText的数据又得重新输入,这是极大的影响用户的体验的。那么我们该如何解决这个问题呢。
首先,我们了解到,当Activity对象调用onDestroy() 方法被摧毁之前会调用Activity的onSaveInstanceState(Bundle b)方法,我们注意到这个方法是有一个Bundle类型的参数的,而在Activity的onCreate(Bundle savedInstanceState) 方法中也有一个Bundle 类型的参数。。。一些聪明的小伙伴或许已经明白了:在Activity创建的时候,onCreate(Bundle savedInstanceState)方法中的Bundle类型的参数就是传入的onSaveInstanceState(Bundle b) 方法中的参数。我们可以把它理解为当Activity要被摧毁时,onSaveInstanceState(Bundle b)方法被调用,将数据保存在Bundle对象中,并且储存在应用程序的某个角落(内存)中,当这个Activity被重新创建时,这个数据传入onCreate(Bundle savedInstanceSatte) 中。OK,明白了这些,让我们一起来试试这个方法的用法:
创建一个Android工程:
activity_main.xml:
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java:
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
public static String dataSaveKey = "data_save_key";
EditText editText = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("MainActivity", "onCreate");
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
if(savedInstanceState != null)
{ editText.setText(savedInstanceState.getString(this.dataSaveKey)); // 启动时恢复数据
}
}
@Override
// 当Activity 对象被摧毁之前系统会调用的方法
protected void onSaveInstanceState(Bundle data)
{
super.onSaveInstanceState(data);
String str = editText.getText().toString();
data.putString(this.dataSaveKey, str); // 将数据保存
}
@Override
public void onDestroy()
{
Log.i("MainActivity", "onDestroy");
super.onDestroy();
}
}
之后,启动程序,在文本编辑框中输入几个字符,然后按住Ctrl+F11 将模拟器方向转向,打开LogCat,可以看到相应的Activity状态信息
MainActivity先被摧毁,然后被创建。
MainACtivity中的EditText开始时的状态为什么也没有:
在EditText中随便输入几个字符,并且将模拟器换了方向之后:
我们发现即使MainActivity经历了先被摧毁,然后被创建的过程,但是其中的EditText控件中的信息并没有丢失。
Ok,任务完成。通过一个Activity类中的方法实现了Activity临时数据的储存