【Android 开发教程】保存状态等信息
2012-05-18 18:32
423 查看
本章节翻译自《Beginning-Android-4-Application-Development》,如有翻译不当的地方,敬请指出。
原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/
目前为止,我们已经了解到了,当改变屏幕方向的时候,activity将会被销毁,随后被重建。请记住一点,当activity被重建之后,它的当前信息可能消失。当一个activity被kill掉,将会调以下方法中的一个或着两个:
onPause() —— 当一个activity被kill掉或被转入后台的时候,这个方法总是被调用。
onSaveInstanceState() —— 当一个activity将被kill掉或转入后台的时候,这个方法也会被掉用,就像onPause()方法一样。但是,当一个activity从调用栈中清除的时候(例如按返回键的时候),这个方法不会被调用(注:onPause()方法会被调用),因为已经没有必要保存它的状态了。
简而言之,想要保存activity的状态,那么总是要实现onPause()方法,然后使用你自己的方法去保存状态信息,例如使用数据库,外部或内部的存储。如果你想简单地保存状态信息,当activity在重新创建的时候,从新加载这些信息。一个简单的方法就是实现onSaveInstanceState()这个方法,因为它提供了一个Bundle对象作为参数,这样,就可以使用这个Bundle对象去保存activity的信息。下面的代码将展示如何使用onSaveInstanceState()方法:[java] view plaincopy@Override
public void onSaveInstanceState(Bundle outState) {
//---save whatever you need to persist---
outState.putString("ID", "1234567890");
super.onSaveInstanceState(outState);
}
当一个activity被重建,onCreate()方法会首先被调用,然后是onRestoreInstanceState()方法,就是这个方法能够取回刚刚通过onSaveInstanceState()方法保存的信息:
[java] view plaincopy@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//---retrieve the information persisted earlier---
String ID = savedInstanceState.getString("ID");
}
尽管可以使用onSavaInstanceState()方法去保存状态信息,但这也有限制:只能通过Bundle对象去保存你的信息。如果你想保存更多的、更复杂的数据结构,这种方法就显得不太合适了。可以使用的另外一种方法是使用onRetainNonConfigurationInstance()回调方法。当一个activity因为配置更改(例如屏幕方向的改变)而奖杯销毁的时候,Android系统将调用这个方法。可以这么使用:[java] view plaincopy@Override
public Object onRetainNonConfigurationInstance() {
//---save whatever you want here; it takes in an Object type---
return("Some text to preserve");
}
把你想保存的东西,通过这个方法返回出来。可以观察到,这个方法返回一个Object对象,这就允许你返回任何数据类型。如果要提取保存的数据,可以在onCreate()方法中进行提取,使用getLastNonConfigurationInstance()回调方法:[java] view plaincopypublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("StateInfo", "onCreate");
String str = (String) getLastNonConfigurationInstance();
}
onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),这两个方法可以允许你随时地保存信息。
例如,当用户下载数据的同时改变了屏幕方法,使用这两个方法去保存数据,总好过重新下载数据吧。
原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/
目前为止,我们已经了解到了,当改变屏幕方向的时候,activity将会被销毁,随后被重建。请记住一点,当activity被重建之后,它的当前信息可能消失。当一个activity被kill掉,将会调以下方法中的一个或着两个:
onPause() —— 当一个activity被kill掉或被转入后台的时候,这个方法总是被调用。
onSaveInstanceState() —— 当一个activity将被kill掉或转入后台的时候,这个方法也会被掉用,就像onPause()方法一样。但是,当一个activity从调用栈中清除的时候(例如按返回键的时候),这个方法不会被调用(注:onPause()方法会被调用),因为已经没有必要保存它的状态了。
简而言之,想要保存activity的状态,那么总是要实现onPause()方法,然后使用你自己的方法去保存状态信息,例如使用数据库,外部或内部的存储。如果你想简单地保存状态信息,当activity在重新创建的时候,从新加载这些信息。一个简单的方法就是实现onSaveInstanceState()这个方法,因为它提供了一个Bundle对象作为参数,这样,就可以使用这个Bundle对象去保存activity的信息。下面的代码将展示如何使用onSaveInstanceState()方法:[java] view plaincopy@Override
public void onSaveInstanceState(Bundle outState) {
//---save whatever you need to persist---
outState.putString("ID", "1234567890");
super.onSaveInstanceState(outState);
}
当一个activity被重建,onCreate()方法会首先被调用,然后是onRestoreInstanceState()方法,就是这个方法能够取回刚刚通过onSaveInstanceState()方法保存的信息:
[java] view plaincopy@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//---retrieve the information persisted earlier---
String ID = savedInstanceState.getString("ID");
}
尽管可以使用onSavaInstanceState()方法去保存状态信息,但这也有限制:只能通过Bundle对象去保存你的信息。如果你想保存更多的、更复杂的数据结构,这种方法就显得不太合适了。可以使用的另外一种方法是使用onRetainNonConfigurationInstance()回调方法。当一个activity因为配置更改(例如屏幕方向的改变)而奖杯销毁的时候,Android系统将调用这个方法。可以这么使用:[java] view plaincopy@Override
public Object onRetainNonConfigurationInstance() {
//---save whatever you want here; it takes in an Object type---
return("Some text to preserve");
}
把你想保存的东西,通过这个方法返回出来。可以观察到,这个方法返回一个Object对象,这就允许你返回任何数据类型。如果要提取保存的数据,可以在onCreate()方法中进行提取,使用getLastNonConfigurationInstance()回调方法:[java] view plaincopypublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("StateInfo", "onCreate");
String str = (String) getLastNonConfigurationInstance();
}
onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),这两个方法可以允许你随时地保存信息。
例如,当用户下载数据的同时改变了屏幕方法,使用这两个方法去保存数据,总好过重新下载数据吧。
相关文章推荐
- Android 程式开发:(八)处理屏幕方向的变化 —— 8.2在“变化”中保存状态信息
- 【Android 开发教程】保存到内部存储设备
- [置顶] android开发之java JDK环境变量配置的信息代码 附详细教程。
- 关于android开发中百度地图地址转换坐标信息的教程
- Android开发之InstanceState详解(转)---利用其保存Activity状态
- Android 开发范例——7.电池状态信息查看
- Android 开发 根据activity前台状态显示通知栏信息或对话框(推送/本地service)
- 【Android 开发教程】保存到外部存储设备(SD卡)
- android launcher开发(2)状态的保存与恢复
- android开发之Fragment利用Bundle保存状态
- 实例探究Android开发中Fragment状态的保存与恢复方法
- Android开发之保存和恢复Activity的状态与数据
- Android开发_如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
- Android开发-进阶:采用SharedPreferences保存用户登录信息
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析
- 【Android开发日记】Fragment切换如何保存状态?Viewpager简单搞定
- android开发之java JDK环境变量配置的信息代码 附详细教程。
- Android开发之文件下载(通知栏中显示进度条,状态信息等)
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析