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 ...
随机推荐
- 图像滤镜艺术---保留细节的磨皮滤镜之PS实现
原文:图像滤镜艺术---保留细节的磨皮滤镜之PS实现 目前,对于人物照片磨皮滤镜,相信大家没用过也听过吧,这个滤镜的实现方法是多种多样,有难有简,有好有差,本人经过长时间的总结,得出了一种最简单,效果 ...
- 微信小程序把玩(一)Hello WeApp
原文:微信小程序把玩(一)Hello WeApp 本篇默认已经成功安装微信小程序工具 新建项目 AppID查看公众开发平台设置查看(https://mp.weixin.qq.com) 项目名称随意填写 ...
- Java 几个有用的命令 - All Options, Memory Options, GC Options, System Properties, Thread Dump, Heap Dump
jcmd ##Refer to http://www.cnblogs.com/tang88seng/p/4497725.html java -XX:+PrintFlagsFinal -version ...
- easyui tree后台传json处理问题
一.tree json格式 [ { "id": 1, "text": "权限管理", "iconCls": " ...
- Qt使用windows API获取程序运行时占用内存 good
使用的是psapi.h中的GetProcessMemoryInfo函数,但是运行到该函数时就强制退出了. 后来,百度到原因是 原来Qt编译时加了-mthread,createprocess时要使的Ha ...
- 查看SharePoint文档库是,显示层次目录,可以点击返回层次
在sharepoint 2013中,Documnet library(文档库)包含多层文件夹,当进入到文件夹后,返回指定层次了(例如返回上一层),需要用浏览器的返回. 使用起来不方便,而且浏览器的返回 ...
- 性别年龄的模块封装类 IDSGenderLeviNamedView
1 IDSGenderLeviNamedView 的实现效果 2 类的封装方法: IDSGenderLeviNamedView.h @interface IDSGenderLeviNa ...
- TopFreeTheme精选免费模板【20130704】
今天我们给大家分享10个最新的主题模板,6款WordPress主题,3款Joomla模板,1款Magento主题.它们分别来自ThemeForest,RocketTheme,YooTheme.有需要的 ...
- 查看linux系统时间和时区
参考地址:http://lidao.blog.51cto.com/ 一.使用date命令查看系统时间 [root@benbang ~]# date -R Tue, 01 Aug 2017 15:43: ...
- docker系列(五):网络通信
1 引言 之前的几篇docker系列博客说的都是单个容器或者镜像的操作.但容器,作为一种简化的操作系统,又怎能不与机器或者容器相互协同工作呢,这就需要用到容器的网络功能.docker中提供了多种不同的 ...