Android Object
2016-06-20 10:16
375 查看
在很多时候我们都要保存一个类实例甚至Activity本身,使得下次再开启Activity时可以读取上次保存的信息。
首先说几点:
1.
很多人(包括我)对Activity生命周期不熟悉的人会误以为方法public void onSaveInstanceState(Bundle savedInstanceState)可以在程序退出时保存数据,但事实是,用户手动退出(如回退键)的情况下并不会调用该方法。众所周知,此时一定会调用的是onPause(),但是该方法没有Bundle参数可以让我们存放数据。
2.
过时函数onRetainNonConfigurationInstance() 以及 getLastNonConfigurationInstance(),这两个也不太靠谱,一是已经过时了,而我在使用时并没有出现了一些BUG,具体什么原因还不清楚。
后来我想到,其实文件读写+写对象是最方便的了,因为我们有强大的ObjectOutputStream,这个类在学习Java时已经体验过用它串行化的效果了。只要把需要保存的类implements
接口serializable,该类就自动扩展为可以被ObjectOutputStream使用的类了。然后事情就变得非常方便:
[java] view
plain copy
public class TableData implements Serializable{
...
}
[java] view
plain copy
FileOutputStream stream = this.openFileOutput("data.s", MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(stream);
oos.writeObject(td);//td is an Instance of TableData;
[java] view
plain copy
FileInputStream stream = this.openFileInput("data.s");
ObjectInputStream ois = new ObjectInputStream(stream);
td=(TableData)ois.readObject();
使用时我们并不需要指定文件路径,其实上,我们不能,文件名参数不能包含文件分隔符'/',那么这个文件其实被保存到哪里了呢?
就在/data/data/包名/files/ 下面,而且第二个参数保证了它的私有性,没有比这更靠谱的方法了!
首先说几点:
1.
很多人(包括我)对Activity生命周期不熟悉的人会误以为方法public void onSaveInstanceState(Bundle savedInstanceState)可以在程序退出时保存数据,但事实是,用户手动退出(如回退键)的情况下并不会调用该方法。众所周知,此时一定会调用的是onPause(),但是该方法没有Bundle参数可以让我们存放数据。
2.
过时函数onRetainNonConfigurationInstance() 以及 getLastNonConfigurationInstance(),这两个也不太靠谱,一是已经过时了,而我在使用时并没有出现了一些BUG,具体什么原因还不清楚。
后来我想到,其实文件读写+写对象是最方便的了,因为我们有强大的ObjectOutputStream,这个类在学习Java时已经体验过用它串行化的效果了。只要把需要保存的类implements
接口serializable,该类就自动扩展为可以被ObjectOutputStream使用的类了。然后事情就变得非常方便:
[java] view
plain copy
public class TableData implements Serializable{
...
}
[java] view
plain copy
FileOutputStream stream = this.openFileOutput("data.s", MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(stream);
oos.writeObject(td);//td is an Instance of TableData;
[java] view
plain copy
FileInputStream stream = this.openFileInput("data.s");
ObjectInputStream ois = new ObjectInputStream(stream);
td=(TableData)ois.readObject();
使用时我们并不需要指定文件路径,其实上,我们不能,文件名参数不能包含文件分隔符'/',那么这个文件其实被保存到哪里了呢?
就在/data/data/包名/files/ 下面,而且第二个参数保证了它的私有性,没有比这更靠谱的方法了!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories