当重建一个活动时,活动的当前状态可能会丢失。当终止一个活动时,将触发以下两个方法中的一个或两个:
简而言之,要保持一个活动的状态,可以实现onPause()方法,然后使用自己的方法来保存活动状态,如利用数据库、内部或外部的文件存储器等。
如果只是想保存活动状态用来在以后活动重建时(例如当设备方向改变时)进行恢复,那么更简单的方法是实现onSaveInstanceState()方法。这个方法提供了Bundle对象作为一个参数,可以用它保存活动的状态。
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("ID", "1234567890");//把ID保存起来
super.onSaveInstanceState(outState);
}
当重建一个活动时,首先触发onCreate()事件,随后是onRestoreInstanceState()方法。此事件可以使您检索先前在onSaveInstanceState方法中通过参数Bundle对象保存的状态:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String ID = savedInstanceState.getString("ID");
}
尽管可以使用onSaveInstanceState()方法来保存状态信息,但要注意只能通过一个Bundle对象保存信息的局限性。如果需要保存更复杂的数据结构,这就不是一个合适的解决方法。
另一个可以使用的方法是onRetainNonConfigurationInstance()方法。当一个活动由于配置改变(例如屏幕方向的变化、键盘是否可用等)将要被销毁时会触发这一方法。可以通过在该方法中返回来保存当前的数据。
@Override
public Object onRetainNonConfigurationInstance(){
return ("Some text to preserve");
}
此方法返回一个Object类型,它几乎允许返回任何数据类型。要提取保存的数据,可以使用getLastNonConfigurationInstance()方法在onCreate()方法中进行提取。
代码示例:
package com.example.androidtest;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//活动重建时恢复数据,提取onRetainNonConfigurationInstance()返回的数据
String str = (String)getLastNonConfigurationInstance();
}
//方法1: 当活动销毁时保存数据
//(例如屏幕方向的变化、键盘是否可用等)将要被销毁时会触发这一方法。 @Override public void onSaveInstanceState(Bundle outState) { outState.putString("ID", "1234567890"); super.onSaveInstanceState(outState); } //方法1: 当活动重建时恢复数据 @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String ID = savedInstanceState.getString("ID"); } //方法2: 当一个活动由于配置改变(例如屏幕方向的变化、键盘是否可用等) //将要被销毁时会触发这一方法。可以通过在该方法中返回来保存当前的数据。 //此方法返回一个Object类型,它几乎允许返回任何数据类型。要提取保存的数据, //可以使用getLastNonConfigurationInstance()方法在OnCreate()方法中进行提取。 @Override public Object onRetainNonConfigurationInstance(){ return ("Some text to preserve"); } }