android之activity中onSaveInstanceState和onRestoreInstanceState触发时机

先看Application Fundamentals上的一段话:  Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is a

大家好,又见面了,我是全栈君。

先看Application Fundamentals上的一段话:

 

 Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

 

从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?

通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

 

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

 

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

 
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121423.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何彻底删除卸载JDK?「建议收藏」

    如何彻底删除卸载JDK?「建议收藏」最近更新了jdk版本,当运行的时候出现错误couldnotopen’D:\jdk1.8.0_171\jre1.8.0_171\lib\amd64\jvm.cfg’主要是因为上个版本没有卸载干净和,jdk与jre安装的位置发生了冲突!解决jdk彻底删除的问题:1.在电脑的控制面板中卸载(基本的办法)。2.采用360安全卫士卸载,有风险(注册列表可能未删干净)3.在运行中…

    2022年6月25日
    52
  • 使用LoadRunner进行并发测试、压力测试和负载测试

    使用LoadRunner进行并发测试、压力测试和负载测试版本为LoadRunner12.551.前期准备工作1.1录制脚本并实现参数化和参数关联1.2插入集合点函数lr_rendezvous(“**”);目的是为了让虚拟用户在这个集合点同时向服务器发送请求以实现并发测试2.开始测试2.1压力测试、负载测试和并发测试的区别分析压力测试:系统达到一定饱和度时,系统处理业务的能力负载测试:找到系统最大的负载能力(通过给系统不断的施压达到饱和状态不能加压为止)…

    2022年7月18日
    25
  • 如何选择集合实现类

    如何选择集合实现类

    2021年11月12日
    54
  • arm 体系架构及其工作原理图_arm架构详解

    arm 体系架构及其工作原理图_arm架构详解架构的演变历史我们首先介绍ARMLtd,这里先说的是公司而不是架构。ARM的发展历史非常久远,超乎许多人的想象。首先,我们提供一些背景信息,ARM成立于20世纪90年代末,从另一家位于剑桥的公司分拆而来,那家公司叫做AcornComputers,曾经是英国教育市场的著名个人台式计算机供应商,现已不复存在。80年代中期时,Acorn一个小团队接受了一个挑战,为他们的下一代计…

    2022年10月14日
    5
  • pycharm配置github_当前系统配置不能运行此程序

    pycharm配置github_当前系统配置不能运行此程序测试开发之代码管理前言一、Pycharm配置git工具1.GitHub新建一个代码仓2.在Pycharm代码中pull下来二、git提交相关规范1.方式一2.方式二三.不规范导致的问题前言团队协作开发自然离不开代码管理工具,使用得当效率高,反之不少麻烦。在这里沉淀对代码管理的理解和运用基于Python自动化测试(UI或接口)基于Pycharm开发工具基于GitHub代码仓库Windows中安装好git工具一、Pycharm配置git工具1.GitHub新建一个代码仓这里是之前去

    2022年8月27日
    5
  • cstring头文件都有什么函数_C语言头文件正确写法

    cstring头文件都有什么函数_C语言头文件正确写法首先,必须要清楚CString是怎么写的,是头两个字母大写!切记,不然就不能用!其次,CString是string的升级版,有很多好用的功能,使用CString一般需要包含头文件atlstr.h,在MFC程序中,可能不用包含,因为CString是MFC的基础功能。

    2022年9月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号