Android onSaveInstanceState和onRestoreInstanceState触发的时机

Android  onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话:

Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

从这句话可以知道,当某个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、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,(本人注:我昨晚调试时就发现原来不一定成对被调用的!)

onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

至于这两个函数的使用,给出示范代码(留意自定义代码在调用super的前或后):

@Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putBoolean("MyBoolean", true); savedInstanceState.putDouble("myDouble", 1.9); savedInstanceState.putInt("MyInt", 1); savedInstanceState.putString("MyString", "Welcome back to Android"); // etc. super.onSaveInstanceState(savedInstanceState); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); boolean myBoolean = savedInstanceState.getBoolean("MyBoolean"); double myDouble = savedInstanceState.getDouble("myDouble"); int myInt = savedInstanceState.getInt("MyInt"); String myString = savedInstanceState.getString("MyString"); }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-10-11 03:17:29

Android onSaveInstanceState和onRestoreInstanceState触发的时机的相关文章

Android使用详解之onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as press

oom-android内存自动清理机制和android垃圾回收器的触发条件

问题描述 android内存自动清理机制和android垃圾回收器的触发条件 有没有对于android系统有深度了解的朋友能解答几个问题: 1.android内存回收机制的LOW_MEMORY和OUT_OF_MEMORY的触发是什么条件,按照网上一些存在的资料给出的答案,LOW_MEMORY是每隔一段时间自动执行的,而OUT_OF_MEMORY是在系统内存不足的时候进行的,这种说法对吗?如果正确,那么他们回收内存的策略是不是一样的? 2.android任务管理器中,内存的回收是在什么条件下执行的

android自定义键盘如何触发事件

问题描述 android自定义键盘如何触发事件 android上点击AActivity的一个EditText,打开自定义键盘,怎么通过自定义键盘上的完成按钮,再触发AActivity的EditText的事件?

我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!

今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯 Android笔记本--半年来的研究笔记,导航. - 思想实践地 - CSDN博客 [魏祝林]Android中级教程 - Androi

android防止提交事件时触发多个表单中的按钮_Android

单击拍照 button ,执行该函数 getPhoto() ,窗体执行的函数 funcSubmit() ng-submit 自动. 什么会需要更改,以防止这种情况发生?它执行的功能只有 getPhoto() 而无需运行 ng-submit 的形式. Ps.: 这段代码是应用程序的一部分 android 移动,用离子框架开发 <ion-view title="OS"> <form ng-submit = "funcSubmit()"> <

谈谈23种设计模式在Android项目中的应用

前言 本文将结合实际谈谈23种设计模式,每种设计模式涉及 定义:抽象化的定义与通俗的描述,尽量说明清楚其含义与应用场景 示例:如果项目中有使用过该模式,则会给出项目中的代码,否则会给出尽可能简单好理解的java代码 Android:该设计模式在Android源码框架中哪些地方有使用到 重构:项目中是否存在可以用该模式进行重构的地方,如果有会给出重构前与重构后的代码或者思路 用这种方式进行介绍设计模式,旨在结合每天都在接触的Android实际项目开发更好地理解设计模式,拉近与设计模式的距离,同时在

Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制

App在后台久置后,再次从桌面或最近的任务列表唤醒时经常会发生崩溃,这往往是App在后台被系统杀死,再次恢复的时候遇到了问题,而在使用FragmentActivity+Fragment的时候会更加频繁.比如,如果Fragment没有提供默认构造方法,就会在重建的时候因为反射创建Fragment失败而崩溃,再比如,在onCreate里面new 一个FragmentDialog,并且show,被后台杀死后,再次唤醒的时候,就会show两个对话框,这是为什么?其实这就涉及了后台杀死及恢复的机制,其中涉

Android开发入门(一)详解活动 1.1 Activity的生命周期

前言: 学习Android也有一年多了,目前在从事Android开发的工作.不敢说精通,但也小有心得 .相信很多android初学者和我刚开始接触android时一样,往往只了解某些知识点的表面,别人要是问点啥 ,还真就说不出个一二三来,往往处于"了解"阶段.所以,我打算将自己学习android的过程和经验总结整 理一下,发表出来,希望对学习android的同学有所帮助,也算给自己的学习进行总结吧.生命不息,学习不 止.一定要学会"享受"学习的过程,否则,学习起来就

Android fragment笔记整理

一直在用Fragment,但是没有系统的整理过,Google了一下相关文章,看到了几篇,将几篇还不错的文章重点整理了下,很多是直接Copy的,只为做个笔记,以后翻来看比较方便,建议大家看一下下面几篇,相信会有一些收获的. Android Fragment 真正的完全解析(上)http://blog.csdn.net/lmj623565791/article/details/37970961 Android Fragment 真正的完全解析(下)http://blog.csdn.net/lmj62