当一个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研究的更多相关文章

  1. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  3. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  4. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  5. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  6. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  7. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  8. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  9. Oracle研究专题:Oracle系统安装与配置

    最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化

    原文:Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化  [函数名称] Wallis图象锐化        WallisSharpen(WriteableBitmap sr ...

  2. linux下计划任务学习记录

    0x01 计划任务简介 linux 中计划任务主要分为”循环执行”和”只执行一次”两种,分别对应的时 crond 服务 和 atd 服务: 0x02 只执行一次的计划任务 0x02.1 atd 服务说 ...

  3. WinForm 清空界面控件值的小技巧

    原文:WinForm 清空界面控件值的小技巧 在WinForm里面有时候需要清空自己输入内容或是选择的选项,以便重新操作流程,那么一般你是怎么清空界面各个控件值的呢?如果窗体里面控件,尤其是TextB ...

  4. WPF常用第三方控件

    NLog日志控件: Install-Package NLog.Config Mysql数据库控件: Install-Package Mysql.Data 最新版本只支持.net 4.5.2及以上版本, ...

  5. EF 里的 join and Group Join

    join ); pageCount = _db.Orders.Count(); return _db.Orders.OrderByDescending(c=>c.ID).Skip(skip).T ...

  6. Delphi xe5调用外部扫描程序——谷歌 zxing

    unit uZXing; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Va ...

  7. Topshelf结合Quartz.NET实现服务端定时调度任务

    这周接受到一个新的需求:一天内分时间段定时轮询一个第三方WebAPI,并保存第三方WebAPI结果. 需求分析:分时段.定时开启.定时结束.轮询.主要工作集中在前三个上,轮询其实就是个Http请求,比 ...

  8. Linux编辑器Vim和Emacs入门

    sudo 命令 debian系统没有自带,需要安装: apt-get install sudo 安装位置为 /usr/bin/sudo,对应配置文件为 /etc/sudoers sudoers授权格式 ...

  9. SpringCloud微服务架构升级总结

    一.背景 1.1 应用系统的架构历史 1.2 什么是微服务? 起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”.文中内容提到:微服 ...

  10. 原生js封装轮播图

    个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...