保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()

当某个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会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

//可以在此保存现场数据,Bundle实际上相当于一个map使用,保存key-value,可以持久化到数据库或者文件,在onCreate方法中做数据还原

@Override
protected void onSaveInstanceState(Bundle outState)
{
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putString("name", "sea");
outState.putString("loginFlag", "yes");
Log.e("onSaveInstanceState", "onSaveInstanceState方法执行了") ;
System.out.println("onSaveInstanceState方法执行了2");
}

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

protected void onRestoreInstanceState(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}

理解: 个人认为anroid框架应该是通过设置了一个静态变量开辟全局内存,让各个方法共享设置Bundle 参数与取用(仅代表个人推测观点)

转载于:https://www.cnblogs.com/sea520/p/4575625.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

setTimeout(function(){}, 0);

1 for (var i 0; i < 3; i) { 2 setTimeout(function() { 3 console.log(i); 4 }, 0); 5 console.log(i); 6 } 结果是&#xff1a; 0 1 2 3 3 3 分析&#xff1a; 1、在实践中&#xff0c;setTimeout 会在其完成当前任何延迟事件的事件处理器的执行&am…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下&#xff0c;我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可&#xff0c;我们知道&#xff0c;默认情况下docker容器是不允许访问系统时钟&#xff0c;但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后&#xff0c;会逐步创建特定文件、文件夹和其它目标的索引&#xff0c;例如开…

Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF

JNIEnv是指向可用JNI函数表的接口指针&#xff0c;原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能。JNIEnv是一个指向线程-局部数据的指针&#xff0c;而线程-局部数据中包含指向线程表的指针。实现原生方法的函数将JNIEnv接口指针作为它们的第一个参数。 原生代…

最佳新秀Java(22)——再次了解泛型

仿制药Java SE 1.5新功能。通用自然是参数化类型。即操作数据类型被指定为一个参数。这样的参数类型可以在课堂上使用、创建的接口和方法&#xff0c;他们被称为通用类、、泛型方法。Java语言引入泛型的优点是安全简单。规则和限制1、泛型的类型參数仅仅能是类类型&#xff08;…

如何编译 dotnet/aspnetcore 源代码

前言最近&#xff0c;准备为 dotnet/aspnetcore 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

转自&#xff1a;http://blog.csdn.net/mergerly/article/details/47731305 1、TOP命令&#xff0c;找到占用CPU最高的进程 [plain] view plaincopy $ top top - 20:11:45 up 850 days, 1:18, 3 users, load average: 1.04, 1.01, 0.99 Tasks: 61 total, 1 running, …

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件&#xff0c;交叉编译就是跨架构编译&#xff0c;编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …

pom.xml配置详解

http://blog.csdn.net/uohzoaix/article/details/7035307转载于:https://www.cnblogs.com/friends-wf/p/3829580.html

Android之在Activity中动态得到Adapter类中数据

1、问题 Activity中动态得到Adapter数据2、解决办法 在Adapter中写入接口Class Adapter {Interface A {void onClick(int a, int b);}A a;public void setListen (A a) {this.a a;}public void A (int a, int b) {if (a ! null ) {a.onClick(a, b);}}} class MainActivity ex…

Convolutional Neural Networks for Visual Recognition 1

Introduction 这是斯坦福计算机视觉大牛李菲菲最新开设的一门关于deep learning在计算机视觉领域的相关应用的课程。这个课程重点介绍了deep learning里的一种比较流行的模型&#xff1a;Convolutional Neural Networks&#xff0c;简称CNN&#xff0c;主要利用CNN来做visual r…

记一次 .NET 某供应链WEB网站 CPU 爆高事故分析

一&#xff1a;背景 1. 讲故事年前有位朋友加微信求助&#xff0c;说他的程序出现了偶发性CPU爆高&#xff0c;寻求如何解决&#xff0c;截图如下&#xff1a;我建议朋友用 procdump 在 cpu 高的时候连抓两个dump&#xff0c;这样分析起来比较稳健&#xff0c;朋友也如期的成功…

html5做的太阳系

效果图&#xff1a; 源代码&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"> <title></title></head><body><canvas id"canvas" width"1000" height"1000" style&…

html中#include file的使用方法

有两个文件a.htm和b.htm&#xff0c;在同一文件夹下a.htm内容例如以下 <!-- #include file"b.htm" --> b.htm内容例如以下 今天&#xff1a;雨 31 ℃&#xff5e;26 ℃ <br />明天&#xff1a;雷阵雨 33 ℃&#xff5e;27 ℃ 直接在浏览器中打开a&#…

Android之第一次不显示EditText光标

1、问题 光标会默认显示在第一个EditText框中&#xff0c;如果不想显示光标&#xff0c;且也不想把该光标移动到下一个EditText框。2、解决办法 在该 EditText之前增加一个不可见的LinearLayout<LinearLayout android:focusable"true"android:focusableInTouchMod…

读取bmp图片数据

1 public void getBMPImage(String source) throws Exception {2 3 clearNData(); //清除数据保存区4 FileInputStream fs null;5 6 try {7 fs new FileInputStream(source);8 int bfLen 14;9 …

Windows 11 任务管理器重磅升级!界面迎来全新设计,十年来首次大改!

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软近日发布了 Windows 11 预览版 Build 22557。在此版本中&#xff0c;任务管理器迎来了全新的设计&#xff0c;这是其自 Windows 8 以来的首次变更&#xff0c; 也是任务管理器十年来最大的一次升级。史诗级更新&#xff0…

modbus调试工具 linux,linux libmodbus的移植

1.前言Modbus是一个工业通信系统&#xff0c;由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。2.移植步骤第一&#xff0c;进入libmodbus目录下&#xff0c;在交叉编译器是最好…

Android之用 ExpandableListView使用解析(三级列表的实现)

&#xfeff;&#xfeff;Android之用 ExpandableListView使用解析&#xff08;三级列表的实现&#xff09; 下载地址如下&#xff1a;http://download.csdn.net/download/u011068702/9839848

微博自媒体,一个新的生态

昨日&#xff0c;微博、UC和360&#xff0c;三方宣布将联合打造自媒体平台&#xff0c;这是继微信公众平台、搜狐新闻客户端、百度百家、今日头条之后的又一大自媒体平台。自媒体平台之争正愈演愈烈&#xff0c;而这对自媒体人和读者来说都算是好事。为何巨头们钟爱自媒体起初微…