配置改变时保持状态信息

作者:追风剑情 发布于:2015-7-19 10:38 分类:Android

       当重建一个活动时,活动的当前状态可能会丢失。当终止一个活动时,将触发以下两个方法中的一个或两个:

  • onPause()——当一个活动被终止或转入后台时都会触发这一方法。
  • onSaveInstanceState()——当一个活动将要被终止或转入后台时,也会触发这一方法(正如onPause()方法一样)。然而,与onPause()方法不同的是,当一个活动从栈中卸载时(例如用户按下了Back按钮)不会触发onSaveInstanceState()方法,这是因为后面无须恢复其状态。

      简而言之,要保持一个活动的状态,可以实现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");
	}
}



标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号