Activity的缓存方法

转载地址:http://blog.csdn.net/zhichu_2025/article/details/52047605

有a、b两个activity,当a进入b之后的一段时间,可能系统就把a回收了,这时候按back键,执行的不是a的onStart()方法,而是onCreate()方法,a被重新创建了一次,这时a的临时数据和状态就很有可能就丢失了。

而Activity中的onSaveInstanceState()回调方法会保存临时的数据和状态,这个方法一定会再activity回收之前调用。方法中有一个Bundle参数,putString()、putInt()等方法需要传入两个参数,一个键一个值。数据保存之后会在onCreate中会恢复,onCreate也有一个Bundle类型的参数。

示例代码:

[java] view plaincopy
  1. protected void onCreate(Bundle savedInstanceState){  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.activity_main);  
  4.     //      当activity第一次被创建的时候为空  
  5.     //      所以我们来判断一下  
  6.     if(savedInstanceState != null){  
  7.         savedInstanceState.getString("anAnt");  
  8. }  
  9. protected void onSaveInstanceState(Bundle outState){  
  10. super.onSaveInstanceState(outState);  
  11. outState.putString("anAnt","Android");  
  12. }  

一、onSaveInstanceState(Bundle outState)    用来保存状态

当某个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、屏幕方向切换时,l例如从竖屏切换到横屏时。(如果不指定configchange属性)在屏幕切换之前,系统会销毁activity A,在切换之后系统又会自动地创建activity A,所以onSavaInstanceState一定会被执行

总而言之,onSaveInstanceState的调用遵循一个重要原则,就是系统未经你允许就销毁你的activity,那么onSaveInstanceState一定会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。另外,注意几点:

        1.布局中的每一个view默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动恢复。但是这个情况只有你为这个UI提供了唯一的ID之后才会起作用,如果没有ID,则不会存储它的状态

2.由于默认的onSaveInstanceState()方法实现了帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法,(super.onSaveInstanceState).

既然有现成的可以用,那我们到底要不要自己来实现onSaveInstanceState()方法呢??这个分情况而定,如果你自己的派生类中有变量影响到UI,或是你程序的行为,当然也要把这个变量也保存了,那么就需要自己实现,否则不需要。

3.由于onSaveInstanceState()方法调用的不可确定性,你应该只使用这个方法去记录activity的瞬间状态(UI的状态),不应该用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)

4.onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但是系统并不保证是否在onPause()之前或者是之后触发

二、onRestoreInstanceState(Bundle outState)   用来恢复数据

需要注意的是,onSaveInstanceState和onRestoreInstanceState并不一定是成对被调用的

onRestoreInstanceState()被调用的前提是,activity A 确实已经被销毁了,而如果仅仅是停留在可能情况下,那么该方法不会被调用。

例如,正在显示activity A 的时候,按下HOME键回到了主界面,然后紧接着又返回activity A,这种情况下,活动一般不会因为内存的原因而被系统销毁,故onRestoreInstanceState方法不会执行。

另外,onRestoreInstanceState的bundle参数也会传到onCreate()中,你也可以选择在onCreate()方法中做数据还原。此方法在onStart()方法之后执行。

   以下的两个函数的使用,注意调用super的前后!!!!

[java] view plaincopy
  1. public void onSaveInstanceState(Bundle savedInstanceState){  
  2.     savedInstanceState.putBoolean("MyBoolean",true);  
  3.     saveInstanceState.putDouble("MyDouble",1.9);  
  4.     savedInstanceState.putInt("MyInt",1);  
  5.     savedInstanceState.putString("MyString","Android");  
  6.     super.onSaveInstanceState(savedInstanceState);  
  7. }  
  8. public void onRestoreInstanceState(Bundle savedInstanceState){  
  9.     super.onRestoreInstanceState(savedRestoreInstanceState);  
  10.     boolean myBoolean = saveInstanceState.getBoolean("MyBoolean");  
  11.     double myDouble = saveInstanceState.getDouble("MyDouble");  
  12.     int myInt = saveInstanceState.getInt("MyInt");  
  13. }  
  14.     protected void onCreate(Bundle savedInstanceState){  
  15.     super.onCreate(savedInstanceState);  
  16.     setContentView(R.layout.activity_main);  
  17.     //      当activity第一次被创建的时候为空  
  18.     //      所以我们来判断一下  
  19.     if(savedInstanceState != null){  
  20.         savedInstanceState.getString("anAnt");  
  21.     }  
  22. }  

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

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

相关文章

c# datatable

DataTable dt new DataTable("cart"); //创建表dt.Columns.Add( new DataColumn("number", Type.GetType("System.String"))); //创建列 dt.Columns.Add( new DataColumn("qq", Type.GetType("System.String")));DataR…

linux pdm 查看工具,linux系统监控工具

通过系统监控可以了解系统的运行状态、及时发现异常、分析原因、提早解决,避免系统故障,确保用户对系统的感知度和满意度。IPTV系统一般是通过告警管理、日志管理、信令跟踪、探针、诊断测试来实现对系统的监控。小编为大家分享了linux系统监控工具&…

windows服务器下com6僵尸***删除

服务器被挂马,有一些可以被清除,有一个***被命名为com6.asp,无法被简单删除,网上baidu了一下,只能通过命令行的方式才能删掉,试了半天还是不可以,最后发现***文件还被设置成为了 RSH 属性&#…

USB抓包

安装的时候需要选上安装完之后,会提示让你重启电脑,如果不重启电脑的话也看不到USB的设备。之后可以通过usb.src来过滤自己想dump的设备信息当然,有一个技巧是,你可以先停止读写你的USB,然后再操作你的USB设备&#xf…

波波的个人简历

本人概况 姓名:bobo民族:汉 学历 (学位 ):大专 联系电话: 54103165联系地址:上海 云景路 185弄 10楼 101室 Email Address : caravarnhotmail.com QQ:179326710性别:男 手机: 139179…

Linux记起始和结束时间,Linux历史命令的记住执行时间

本文主要说明平台是Red Hat / CentOS系列系统。当安装完一台Linux后,我们可以把下列事情当作第一件要做的事:让history记录执行命令的时间:上代码export HISTTIMEFORMAT"[%Y-%m-%d %H:%M:%S] "export HISTFILESIEZE1000000export H…

Appium的环境搭建和配置

Appium的环境搭建和配置 一、安装Nodejs 下载nodejs安装包(https://nodejs.org/en/download/)安装 下载后,双击安装文件,按提示来安装。 测试安装是否成功:运行cmd,输入node –v 二、安装android的SDK 安装…

[转载]C#异步委托的用法 .

每个委托都有三个方法:Invoke、BeginInvoke、EndInvoke。第一个方法是委托指定函数的同步调用,另外两个是异步调用。BeginInvoke方法,调用后立即返回,不等待调用结果。EndInvoke方法,用于检索调用结果。调用BeginInvok…

sqlite3的基本操作

转自:http://blog.chinaunix.net/uid-26833883-id-3239313.html一、数据库基本概念 A.数据(Data)能够输入计算机并能被计算机程序识别和处理的信息集合。B.数据库(Database)数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。注意&am…

收藏这些芯片原厂的代码仓库

本次给大家分享一些芯片原厂的代码仓库,这些资源已收录到咱们嵌入式大杂烩的资源仓库里了:https://gitee.com/zhengnianli/EmbedSummary我们用到一个新的芯片时,一般在它们的官网都可以找到一些入门、上手的资料。除此之外,有些原…

javascript计算小数保留两位小数,多位小数的方法

<SCRIPT LANGUAGE"JavaScript"><!--functionformatFloat(src, pos){ return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);}alert(formatFloat("1212.2323", 2));//--></SCRIPT>转载于:https://www.cnblogs.com/catxp/archi…

Android dumpsys命令详细使用

Android dumpsys命令详细使用 一、dumpsys命令介绍 1.命令说明 Dumpsys用户系统诊断&#xff0c;它运行在设备上&#xff0c;并提供系统服务状态信息 命令格式&#xff1a; adb shell dumpsys [system serbices] 2.系统服务查询 如果直接运行adb shell dumpsys&#xff0c;将会…

qemu+linux+x86+64,qemu以64位跟32位的方式跑busybox

qemu以64位和32位的方式跑busybox两种方式x86_64 和32位的i386方式-----------x86_64-----------------------------------------参考http://mgalgs.github.io/2015/05/16/how-to-build-a-custom-linux-kernel-for-qemu-2015-edition.html下载busybox和linux内核TOP/var/www/my…

基于 esp32 + lvgl8.0 的小电视

一个有趣的作品&#xff0c;转给需要的小伙伴。详情可阅读&#xff1a;https://gitee.com/wangpeng25/the-little-bili-tv输入图片说明支持功能微信配网&#xff08;完成&#xff09;时间显示&#xff08;完成&#xff09;三日天气显示&#xff08;完成&#xff09;温湿度显示&…

Android中常见的MVC/MVP/MVVM模式

Android中常见的MVC/MVP/MVVM模式 经典MVC 在1979年&#xff0c;经典MVC模式被提出。 在当时&#xff0c;人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来&#xff0c;而Trygve Reenskaug在跟一些人的讨论中&#xff0c;逐渐剥离出一系列的概念&#xf…

同步滚动两个DataGrid

拿到这个首先想到的就是重写Scroll方法&#xff0c;可是想想工作量有些大&#xff0c;所以想在Form级别上做做手脚&#xff0c;看看DataGrid的成员列表可以看到这样两个保护性的方法&#xff1a;GridHScrolled Listens for the horizontal scrollbars scroll even…

RISC-V踩坑记----__builtin_clz((x)库函数的应用

RISC-V的确是个好东西&#xff0c;可是&#xff0c;免费的东西往往需要付出代价才能得到了&#xff0c;最近遇到了一个算法中的问题&#xff0c;追了好久&#xff0c;最终追到了这个库函数中&#xff0c;没想到&#xff0c;这个库函数居然还隐藏着一些猫腻。值得记下来啊。 首先…

整蛊偷快递的家伙!不愧是 NASA 工程师

分享个有意思的新闻给大家&#xff0c;一笑之余&#xff0c;也可以学习下文中主角的理工科思维。不知道你有木有过。。快递包裹被别人偷走的经历&#xff1f;&#xff1f;包裹历经波折终于到了家门口&#xff0c;结果。。却被人给顺走了&#xff01;&#xff01;报警&#xff1…

dns 320 linux,linux 下 dns服务器(三 配置篇)

如何设置一个caching only域名服务器1 设置所谓caching only域名服务器是指一个服务器运行有n a m e d进程&#xff0c;但是并不对任何域(区)的域名信息具有授权&#xff0c;也就是并不向外提供本域的域名匹配信息&#xff0c;不负责I n t e r n e t上对本组织域名解析的应答&…

图解Cisco Packet Tracert之利用TFTP来升级路由器的IOS

对于我们这些学生来说&#xff0c;如果是自学的朋友来说&#xff0c;想摸到真机那实在是太难了&#xff0c;说去买一台呢&#xff1f;买来又没有多大作用&#xff0c;利用dynamips来模拟呢&#xff0c;他本来就是加载的IOS&#xff0c;在flash里面又没有IOS&#xff0c;这时候那…