Android Activity如何保存和恢复Object
2015-11-19 15:32
483 查看
Android Activity中提供了onSaveInstanceState()和onRestoreInstanceState()的方法,对简单的数据类型进行存储和恢复。
如果需要保存一些复杂的Object,例如socket、自定义类等等,可以用两种方法做到:
1. 使用Activity中的函数onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()。 下面是这两个函数的使用范例:
=====================================================================
public class MainActivity extends Activity {
MyObject m;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(getLastNonConfigurationInstance() != null)
m = (MyObject)getLastNonConfigurationInstance();
else
m = new MyObject();
TextView a = (TextView)findViewById(R.id.textView1);
a.setText(m.a.get(0));
}
@Override
@Deprecated
public Object onRetainNonConfigurationInstance() {
return m;
}
public void onclickbutton(View v) {
m.a.set(0, "s");
}
}
=====================================================================
但是,onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()在API13之后已经不推荐使用了。官方推荐使用的是Fragment的setRetainInstance(true)。为什么要用这个方法、以及怎么使用这个方法,可以参考:
http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
2. 使用Gson将你的Object转换成String。
Gson是一个用于将java对象转换为json格式的java工具库. 它也可以将json格式的字符串转换为等价的 java 对象. Gson适用于任何java 对象, 包括那些已经存在的, 没有源代码的java对象。保存你的Object的思路,即为先将你的Object转换成String,并在onSaveInstanceState()中通过Bundle.putString()的方法存储;再恢复你的Activity的时候,我们在onRestoreInstanceState()中通过Bundle.getString()的方法,得到你存储的String,再通过Gson转换成你的Object实例。
以下是示例代码:
=====================================================================
MyObject m;
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Gson g = new Gson();
m = g.fromJson(savedInstanceState.getString("MyObject"), MyObject.class);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Gson g = new Gson();
String mm = g.toJson(m);
outState.putString("MyObject", mm);
}
=====================================================================
请记住onRestoreInstanceState(Bundle savedInstanceState)是在Activity的onStart()方法执行之后调用。onSaveInstanceState(Bundle outState)是在onPause()方法执行之前调用。
当然,如果你的Activity在onDestroy()前调用了finish(),那么以上两种方法都无法保存和恢复你的对象。那么你的Object就需要通过文件、或者SharedPreference等方法保存了。
附:
onDestroy()前调用finish()方法的行为:onBackPressed() (按下退出键)、 通过settings或任务管理器关闭activity
onDestroy()前不调用finish()方法的行为:Activity转换orientation(此时只是重新create该Activity,不调用finishi())
分享到:
如果需要保存一些复杂的Object,例如socket、自定义类等等,可以用两种方法做到:
1. 使用Activity中的函数onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()。 下面是这两个函数的使用范例:
=====================================================================
public class MainActivity extends Activity {
MyObject m;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(getLastNonConfigurationInstance() != null)
m = (MyObject)getLastNonConfigurationInstance();
else
m = new MyObject();
TextView a = (TextView)findViewById(R.id.textView1);
a.setText(m.a.get(0));
}
@Override
@Deprecated
public Object onRetainNonConfigurationInstance() {
return m;
}
public void onclickbutton(View v) {
m.a.set(0, "s");
}
}
=====================================================================
但是,onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()在API13之后已经不推荐使用了。官方推荐使用的是Fragment的setRetainInstance(true)。为什么要用这个方法、以及怎么使用这个方法,可以参考:
http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
2. 使用Gson将你的Object转换成String。
Gson是一个用于将java对象转换为json格式的java工具库. 它也可以将json格式的字符串转换为等价的 java 对象. Gson适用于任何java 对象, 包括那些已经存在的, 没有源代码的java对象。保存你的Object的思路,即为先将你的Object转换成String,并在onSaveInstanceState()中通过Bundle.putString()的方法存储;再恢复你的Activity的时候,我们在onRestoreInstanceState()中通过Bundle.getString()的方法,得到你存储的String,再通过Gson转换成你的Object实例。
以下是示例代码:
=====================================================================
MyObject m;
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Gson g = new Gson();
m = g.fromJson(savedInstanceState.getString("MyObject"), MyObject.class);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Gson g = new Gson();
String mm = g.toJson(m);
outState.putString("MyObject", mm);
}
=====================================================================
请记住onRestoreInstanceState(Bundle savedInstanceState)是在Activity的onStart()方法执行之后调用。onSaveInstanceState(Bundle outState)是在onPause()方法执行之前调用。
当然,如果你的Activity在onDestroy()前调用了finish(),那么以上两种方法都无法保存和恢复你的对象。那么你的Object就需要通过文件、或者SharedPreference等方法保存了。
附:
onDestroy()前调用finish()方法的行为:onBackPressed() (按下退出键)、 通过settings或任务管理器关闭activity
onDestroy()前不调用finish()方法的行为:Activity转换orientation(此时只是重新create该Activity,不调用finishi())
分享到:
相关文章推荐
- 关于错误 libstdc++.so.6:cannot open shared object file 和 libstdc++.so.6: wrong ELF class 的解决和思考
- underscore源码解析(object)
- Bucket不为空,请检查该Bucket是否包含未删除的Object或者未成功的Multipart碎片
- 初学Objective-C
- Objective-C 编码建议
- Objective-C基础-类方法的学习
- iOS开发系列—Objective-C之Foundation框架
- Objective-C 编码建议
- Objective-C 编码建议
- Java Object 类源码分析
- Objective-c:类目、延展、协议
- object references an unsaved transient instance
- _nm_object_get_property: Error getting 'State' for /org/freedesktop/NetworkManager/ActiveConnection/
- Java不定参数Object… obj
- [2015.11.18] Objective-c UIScrollView 页面跳转 线传值
- Objective-C 学习笔记 - 第1章 入门
- Objective-C 学习笔记 - 第1章 入门
- Object-C排序的几种方法
- Geometry-Shader Object
- 新书Effective Objective-C 2.0