说明
数据存在内存中,有的时候应用异常退出要恢复时会导致数据丢失等情况,这个时候就需要对数据储存做一些其他处理,如存在SaveInstanceState中,或者永久性储存中。这里介绍一下onSaveInstanceState() 储存数据数据的用法。
使用方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//恢复容易被回收的数据
if(savedInstanceState!=null){
//todo 用savedInstanceState读取你所需的数据,记得判空
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState)
// 为了防止万一程序被销毁的风险,这个方法可以保证重要数据的正确性
// 不写这个方法并不意味着一定出错,但是一旦遇到了一些非常奇怪的数据问题的时候
// 可以看看是不是由于某些重要的数据没有保存,在程序被销毁时被重置
//切换到其它apk时,当内存不足时,在之前设置的静态变量投保人会被回收掉。所以在此要保存
//todo 用savedInstanceState储存数据
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//todo 用savedInstanceState恢复所需数据,记得判空
}
注意事项
- 用Bundle存储数据以便于跨进程传递,存储上限受限于Binder(1M),请勿用于存储大量数据(如Bitmap),也不要存需要冗长序列化和反序列化操作的复杂数据结构;
- onSaveInstanceState()会将数据序列化到磁盘,如果序列化对象很复制,序列化时会占用大量内存,可能丢帧和视觉卡顿;
适用场景
适用于:配置更改后少量数据(如分辨率调整、权限变更、系统字体样式变更、系统语言切换、多窗口设定、系统导航方式变更等),Activity异常关闭,进程被终止后重新打开需要恢复的场景。
网友评论