全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android  onSaveInstanceState和onRestoreInstanceState触发的时机

Android  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 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方法中做数据还原。

至于这两个函数的使用,给出示范代码(留意自定义代码在调用super的前或后):

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putBoolean("MyBoolean", true);
    savedInstanceState.putDouble("myDouble", 1.9);
    savedInstanceState.putInt("MyInt", 1);
    savedInstanceState.putString("MyString", "Welcome back to Android");
    // etc.
    super.onSaveInstanceState(savedInstanceState);
}
 
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
 
    boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
    double myDouble = savedInstanceState.getDouble("myDouble");
    int myInt = savedInstanceState.getInt("MyInt");
    String myString = savedInstanceState.getString("MyString");
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# onSaveInstanceState和onRestoreInstanceState  # Android  # onSaveInstanceState和onRestoreInstanceState分析  # Android 事件触发机制的深入学习  # Android onNewIntent()触发机制及注意事项  # android防止提交事件时触发多个表单中的按钮  # Android实现指定时间定时触发方法  # 按下  # 这是  # 其他的  # 仅仅是  # 几种  # 的是  # 情况下  # 就会  # 也不  # 还没有  # 让你  # 也会  # 那就  # 你也  # 什么时候  # 有机会  # 会在  # 你不  # 这句话  # 我们可以 


相关文章: Bpmn 2.0的XML文件怎么画流程图  实惠建站价格推荐:2025年高性价比自助建站套餐解析  ,南京靠谱的征婚网站?  如何在腾讯云免费申请建站?  常州企业建站如何选择最佳模板?  已有域名如何快速搭建专属网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  宝塔建站无法访问?如何排查配置与端口问题?  如何快速搭建安全的FTP站点?  如何快速完成中国万网建站详细流程?  如何在万网自助建站平台快速创建网站?  如何通过FTP服务器快速搭建网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  C++如何编写函数模板?(泛型编程入门)  行程制作网站有哪些,第三方机票电子行程单怎么开?  公众号网站制作网页,微信公众号怎么制作?  网站制作新手教程,新手建设一个网站需要注意些什么?  如何快速生成ASP一键建站模板并优化安全性?  如何在建站主机中优化服务器配置?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  广州商城建站系统开发成本与周期如何控制?  如何通过VPS建站实现广告与增值服务盈利?  如何快速配置高效服务器建站软件?  建站之星安装后界面空白如何解决?  建站主机SSH密钥生成步骤及常见问题解答?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  个人网站制作流程图片大全,个人网站如何注销?  定制建站价位费用解析与套餐推荐全攻略  如何确认建站备案号应放置的具体位置?  如何选择域名并搭建高效网站?  如何选购建站域名与空间?自助平台全解析  如何选择可靠的免备案建站服务器?  网站制作公司排行榜,四大门户网站排名?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  企业微网站怎么做,公司网站和公众号有什么区别?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  网站代码制作软件有哪些,如何生成自己网站的代码?  建站之星代理商如何保障技术支持与售后服务?  *服务器网站为何频现安全漏洞?  移民网站制作流程,怎么看加拿大移民官网?  香港服务器租用每月最低只需15元?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  高性价比服务器租赁——企业级配置与24小时运维服务  如何快速上传自定义模板至建站之星?  如何配置WinSCP新建站点的密钥验证步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。