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 ...
随机推荐
- 【Git】整合分支那些事儿
对于scm这个岗位来说,基线升级应该是这个岗位需要的必备技能了,现在来说说我司进行高通代码基线升级时选择的方式方法,供大家参考,也供自己学习积累. git这个工具大家都并不陌生,但是对于不经常提交代码 ...
- Win8Metro(C#)数字图像处理--2.29图像除法运算
原文:Win8Metro(C#)数字图像处理--2.29图像除法运算 [函数名称] 图像除法函数DivisionProcess(WriteableBitmap src, WriteableBit ...
- 利用ZoomPipeline迅速实现基于线程池的全异步TCP点对点代理
在博文<一种基于Qt的可伸缩的全异步C/S架构服务器实现>中提到的高度模块化的类可以进行任意拆解,实现非常灵活的功能.今天,我们来看一看一个公司局域网访问英特网云服务器的点对点代理例子.代 ...
- Android零基础入门第50节:StackView卡片堆叠
原文:Android零基础入门第50节:StackView卡片堆叠 上一期学习了AdapterViewFilpper的使用,你已经掌握了吗?本期开始学习StackView的使用. 一.认识StackV ...
- 核心思想:互联网创业十问?(大部分创业者是从学习借鉴成功者起步的,不需要把商业模式考虑完备,失败者没资格说趁着年轻...)4种失败的信号 good
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:曹政链接:https://www.zhihu.com/question/20264499/answer/28168079来源: ...
- vmstat命令浅析
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...
- 每一位想有所成就的程序员都必须知道的15件事(走不一样的路,要去做,实践实践再实践,推销自己,关注市场)good
从 为之漫笔作者:为之漫笔 有超过 100 人喜欢此条目 原文地址:How to advance your career? Read the Passionate Programmer! 我刚看完Ch ...
- Design Thinking Workshop @ Agile Tour 2013 Shanghai
设计思维工作坊 上周日在2013年敏捷之旅上海站,引导分享了一个设计思维的工作坊.这个工作坊持续了3个小时.来篇流水账分享给大家. 我们的设计挑战是什么呢?左思右想,在准备设计挑战题目的时候纠结了好久 ...
- 《C++ Primer》读书笔记 第一章
读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...
- hgoi#20190515
T1-Pie or die Volodya和Vlad在玩下面的这个游戏.这里有k个派,分布在n×m的板子上.每一回合Volodya移动一个派到这个派边界的格子,如果这个派在板子的边界,Volodya就 ...