android_onSaveInstanceState_onRestoreInstanceState研究
当一个activity的状态是一个容易被系统宰掉时,比如pause或者stop状态,此时这个活动不一定已经被销毁了,那么这个activity的onSaveInstanceState方法会被系统调用(值得一试),上代码:
package cn.com.sxp;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class OnrestoreActivity extends Activity {
private static final String TAG = OnrestoreActivity.class.getSimpleName();
private int count = 0;
private boolean thread;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (null != savedInstanceState) {
int preSavedInt = savedInstanceState.getInt("preSavedInt");
String preSavedStr = savedInstanceState.getString("preSavedStr");
Log.e(TAG, "onCreate we get prior preSavedInt is: " + preSavedInt
+ " and preSavedStr is: " + preSavedStr);
}
setContentView(R.layout.main);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (!thread) {
Log.v(TAG, Boolean.toString(thread));
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
count++;
Log.v(TAG, "count : " + count);
}
}
}
}).start();
}
@Override
// 为了防止万一程序被销毁的风险,这个方法可以保证重要数据的正确性
// 不写这个方法并不意味着一定出错,但是一旦遇到了一些非常奇怪的数据问题的时候
// 可以看看是不是由于某些重要的数据没有保存,在程序被销毁时被重置
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("preSavedInt", count);
savedInstanceState.putString("preSavedStr", "we are saved in onSaveInstanceState");
super.onSaveInstanceState(savedInstanceState);
Log.e(TAG, "onSaveInstanceState");
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int preCount = savedInstanceState.getInt("preSavedInt");
String preStr = savedInstanceState.getString("preSavedStr");
Log.e(TAG, "onRestoreInstanceState we get preCount is: " + preCount + " and preStr is: "
+ preStr);
}
public void onDestroy() {
super.onDestroy();
this.thread = true;
}
public void onPause() {
Log.v(TAG, "onPause");
super.onPause();
thread = true;
}
public void onResume() {
Log.v(TAG, "onResume");
super.onResume();
thread = false;
}
public void onStop() {
Log.v(TAG,"onStop");
super.onStop();
this.thread = true;
}
}
当活动onresume时打印日志如下:

此时一切正常,没有调用onsave等方法;就这样我让这个线程跑了30多次,之后做了一个横竖屏切换,发生的日志如下:

可以看到,此时活动即将转入onpause状态,在这之前系统调用了onsave方法,果然啊,系统怕在onpause时宰掉活动,所以调用该方法保存一些数据,后面才依次调用onpause和onstop方法。
再看看,切换到竖屏后,活动被重新构建,果然此时活动就从之前保存的数据再读出来。oncreate后又调用了onrestore方法,之后才是正常的其他状态出马,继续恢复起线程的运行。
好了,到这里我手痒,又按下了home键,日志打印如下:

可以看到,与切换到竖屏是一样的效果。
好吧,恢复这个程序的运行吧,日志如下:

继续onresume。
很强大。以上事例说明,我本人不想销毁,但是系统由于内存的原因或者其他什么原因不得不销毁,系统还不给我机会让我保存数据?倘若该activity被我主动宰掉的话,例如我闲的蛋疼按下BACK键,这个方法就不会被调用(值得一试)。
先总结以下几点关于onSaveInstanceState方法被调用的场景:
1、爷按下HOME键
按下后,当然是home界面了,原来的应用程序当然不可见啦,应该是stop状态(以上已经测试);这就危险了,该活动可能被销毁,所以被调用(以上已经测试);
2、按下电源按键(关闭屏幕显示)
也就是我要待机了
3、从一个活动activity启动第二个activity(没有测试)
4、横竖屏切换(以上已经测试)
那还有一个onRestoreInstanceState方法呢。这个方法调用前提是,一个activity被创建了(以上已经测试)。因为一个activi被创建后,你哪知道它之前是呗销毁了还是没有被销毁的。当然啦,如果是被销毁的,那么onCreate与onRestoreInstanceState的bundle参数是一个参数吧(已经测试,输出是一样的)。
android_onSaveInstanceState_onRestoreInstanceState研究的更多相关文章
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(下)
SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...
- 开源Word读写组件DocX 的深入研究和问题总结
一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- Oracle研究专题:Oracle系统安装与配置
最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...
随机推荐
- SQL Server 限制IP登陆(登陆触发器运用)
原文:SQL Server 限制IP登陆(登陆触发器运用) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 补 ...
- DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- 【码云周刊第 32 期】程序员眼中的 Vue 与 Angular !
码云项目推荐 基于 Vue 的项目: 1.项目名称:基于 Vue.js 的 UI 组件库 项目简介:iView 是一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品. 项目地 ...
- java的clone()、浅拷贝与深拷贝
clone()方法是Object的native方法.protected native Object clone() throws CloneNotSupportedException; 声明为pro ...
- oracle rac 修改dbid和dbname
=======================修改数据库dbid====================== 1.查看目前数据库dbid以及dbname [root@rac01 ~]# su - or ...
- 修改Maven的本地仓库地址
已经配置好的设定文件: 1.创建一个本地仓库的地址 2.修改Maven中conf目录下的settings.xml文件 在此处添加修改后的本地仓库的地址 3.打开cmd 输入mvn help:sys ...
- spark 源码分析之四 -- TaskScheduler的创建和启动过程
在 spark 源码分析之二 -- SparkContext 的初始化过程 中,第 14 步 和 16 步分别描述了 TaskScheduler的 初始化 和 启动过程. 话分两头,先说 TaskSc ...
- Python自学day-15
一.防止页面变形 在改变浏览器大小时,可能会导致里面的元素变形(特别是用百分比设置的宽度). 那么,我们如何解决这个问题? 可以在最外层的元素(例如div)中,设置一个固定像素的宽度,例如: < ...
- js获取radio选中索引值
<form name="form1" onsubmit="return foo()"> <input type="radio&quo ...
- kubernetes实战篇之helm安装
系列目录 Helm是kubernetes的应用包管理工具,是CNCF孵化器下的一个项目,主要用来管理 Charts.类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM.它提供了一种简单 ...