Android笔记:onSaveInstanceState和onRestoreInstanceState总结

简介:

一、方法调用时间

  1. onSaveInstanceState是用来保存UI状态,在Activity杀死之前,它一般在onStop或者onPause之前触发;

  2. onRestoreInstanceState是在onResume之前触发来恢复状态;

  3. Activity被杀死了,onCreate会被调用,且onRestoreInstanceState在 onResume之前恢复上次保存的信息;

  4. Activity没被杀死,onCreate不会被调用,但onRestoreInstanceState 仍然会被调用,在 onResume之前恢复上次保存的信息;




二、方法使用场景 

  1. onSaveInstanceState() 只有在Acitivity被系统kill掉时才会调用。所以通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

  2. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据,持久化数据应该当用户离开当前的activity时,在onPause()中保存(比如将数据保存到数据库或文件中)。说到这里,还要说一点的就是在onPause()中不适合用来保存比较费时的数据,所以这点要理解。

  3. 由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中。若是永久性值,则在onPause()中保存;若大量,则另开线程吧,别阻塞UI线程。 



三、使用方法

1.在onSaveInstanceState方法中保存bundle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     @Override
     protected  void  onSaveInstanceState(Bundle outState)
     {
         super .onSaveInstanceState(outState);
         mMapView.onSaveInstanceState(outState);
         
         saveState(outState);
     }
     
     @Override
     protected  void  onRestoreInstanceState(Bundle InState)
     {
         super .onRestoreInstanceState(InState);
         mMapView.onSaveInstanceState(InState);
         
         restoreState(InState);
     }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     /**
      * 进入三维模块后,该activity会被kill掉,此处保存被杀掉前的一些状态数据
     
      * @param outState
      */
     private  void  saveState(Bundle outState)
     {
         outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_JSON, mJson);
         outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_GALLERY, mGalleryJson);
         outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_FLASH, mFlashJson);
         outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_VIDEO, mVideoList);
         outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_NEWS, mNewsList);
         outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_HOUSELIST, mEstateHouseList);
     }
     
     private  void  restoreState(Bundle inState)
     {
     }


2.在oncreate或者onRestoreInstanceState方法中读取保存的bundle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
         if  (savedInstanceState ==  null )
         {
             //正常情况
             loadTask();
         }
         else
         {
             //进入三维图被kill后返回,恢复页面数据
             mJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_JSON);
             mGalleryJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_GALLERY);
             mFlashJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_FLASH);
             mVideoList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_VIDEO);
             mNewsList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_NEWS);
             mEstateHouseList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_HOUSELIST);
             
             
             if (mJson !=  null  && mGalleryJson !=  null  && mFlashJson !=  null  && mVideoList !=  null  && mEstateHouseList !=  null )
             {
                 loadComplete();
             }
             else
             {
                 loadTask();
             }
         }




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1432616,如需转载请自行联系原作者

目录
相关文章
|
1小时前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
49 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
48 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
27 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
57 1
|
7月前
|
Java Android开发
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
|
7月前
|
Android开发
[笔记]Android开发之相机开发 Camera1、2、X
[笔记]Android开发之相机开发 Camera1、2、X
|
编解码 Android开发
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
482 0
Android | 老生常谈!屏幕适配原理 & 方案总结笔记
|
11月前
|
Java Android开发 容器
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
|
存储 前端开发 Shell
Android Jetpack Compose——一个简单的笔记APP
此项目功能较为简单,基本就是使用Room数据库实现CRUD,但是此项目实现了一个干净的架构,项目使用MVVM架构进行设计,每一个模块的职责划分清晰,功能明确,没有冗余的代码。其中涉及了Hilt依赖注入,对于数据库的的操作,使用接口实现类进行获取,然后将实现类的CRUD操作封装在一个数据类中,最后通过Hilt自动注入依赖,供外部调用。
588 1
Android Jetpack Compose——一个简单的笔记APP