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小时内与您取得联系。