以前只知道在Activity销毁之前,要把数据保存在 onSaveInstanceState(Bundle)方法中,后来学习了别人的微博,学到了很多细节问题,所以整理了一下,希望能帮到大家。

如果看官方文档会发现:对于activity的销毁,有下面这么一个表:

"Killable"表示当前activity是否可以被杀死,意思是说当上面标记为Killable的方法返回之后,activity就可能随时被杀死。从表中不难看出在onPause方法调用完之前,activity都是不能够被杀死的,而onStop()和onDestroy()都是可以被杀死的。

但是图中又标出了一个黄色的标记:HONEYCOMB。官方文章原文是这样说的:Starting with Honeycomb, an application is not in the killable state until itsonStop() has returned.

从Honeycomb(Android 3.0)开始,应用只有等到onStop()方法返回之后,才可以被杀死,也就是说在执行完onStop()方法之前,应用都不可能被杀死。you should usethe onPause() method to write any persistent data (such as user edits) to storage.你应该在onPause()方法中去存储那些持久性的数据,比如用户的输入等。

the method onSaveInstanceState(Bundle) is called before placing the activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate(Bundle) if the activity needs to be re-created.

onSaveInstanceState(Bundle)将在activity转入“background state后台状态”之前被调用,能让我们存储一些activity的动态的状态值到Bundle对象中,以便在之后调onCreate(Bundle)方法时用到。

这里提到一个“background state后台状态”,我们来看看activity的几种状态:

前台状态

  • 通俗的说就是可以看到,且可以操作(有焦点)的状态

  • 可视状态

  • 即可以看得见(没有被完全遮挡),但是没有焦点,不可以触摸操作;比如躲在对话框后面的activity

  • 后台状态

  • 已经看不到了,系统可以将这个进程杀死来回收内存。如果在这种状态下activity被系统杀死了,那么在用户重新打开这个activity的时候,它的onCreate方法会使用之前onSaveInstanceState(Bundle)保存的状态数据,来让自己恢复到之前的状态

  • 空进程状态

  • 一个没有持有任何activity和任何应用组件的进程,比如Services或者广播接受者,当内存不足的时候,它们将会被先杀死并回收。

    也就是说onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用;我们都知道在默认情况下,在旋屏之后,activity会重新经历一次生命周期,下面的log就是在点击旋屏之后的执行顺序:

  • 这样看起来,那种要保存的永久性性数据,应该在onPause下完成,而activity的一些状态值,比如组件宽高之类的,应该在onSaveInstanceState中保存在Bundle中去。

    但是要注意的是,官方文档最后又给出了一个警告:

     Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation.

    由于onSaveInstanceState(Bundle)方法不是activity生命周期中的回调方法之一,所以在activity被杀死的时候,它是不能保证百分百的被执行的,所以在这个方法也不一定是完全靠谱的。

    生命周期图:

  • 转载请注明出处:http://blog.csdn.net/cyp331203/article/details/44985087

Android中activity保存数据和状态在哪个方法实现的更多相关文章

  1. android中正确保存view的状态

    英文原文: http://trickyandroid.com/saving-android-view-state-correctly/ 转载此译文须注明出处. 今天我们聊一聊安卓中保存和恢复view状 ...

  2. activity 保存数据

    activity 保存数据对android的商业项目十分的重要,譬如你在发微博的时候,突然来了一个电话,你洋洋洒洒写了100个字,你不能保存的话,你岂不要卖要骂娘. 那activity究竟是保存数据的 ...

  3. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  4. Android进阶笔记08:Android 中Activity、Window和View之间的关系

    1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...

  5. 【android】android中activity的生命周期

    activity生命周期: 实例代码: public class DemoActivity extends Activity { //1.activity第一次被创建的时候,执行 @Override ...

  6. Android中Activity的四种启动方式

    谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...

  7. Android学习笔记-保存数据的实现方法1

    Android开发中,有时候我们需要对信息进行保存,那么今天就来介绍一下,保存文件到内存,以及SD卡的一些操作,及方法,供参考. 第一种,保存数据到内存中: //java开发中的保存数据的方式 pub ...

  8. android 中activity 属性说明(转载)

    转自:http://liuwuhen.iteye.com/blog/1759796 activity是android中使用非常平凡的一种组件,我们除了需要掌握activity中的生命周期以外,还需要掌 ...

  9. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

随机推荐

  1. SQL基础常用语法

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 DROP database dbname 3.说明:创建新表 create table ...

  2. [Jobdu] 题目1367:二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  3. php基础教程笔记2

    如果学过c.java,php的语法不学即会,但是不同的是php是一种脚本语言,需要解释器才能运行.php又和js不同,js是客户端语言,而php运行在服务器端,它无法获取客户端浏览器信息.但是php又 ...

  4. codeforces 451E. Devu and Flowers 容斥原理+lucas

    题目链接 给n个盒子, 每个盒子里面有f[i]个小球, 然后一共可以取sum个小球.问有多少种取法, 同一个盒子里的小球相同, 不同盒子的不同. 首先我们知道, n个盒子放sum个小球的方式一共有C( ...

  5. [LeetCode]题解(python):131-Palindrome Partitioning

    题目来源: https://leetcode.com/problems/palindrome-partitioning/ 题意分析: 给定一个字符串s,将s拆成若干个子字符串,使得所有的子字符串都是回 ...

  6. Python collections.defaultdict 笔记

    其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...

  7. [转]Swift 简介 - 苹果最新的编程语言

    Swift 真的可以说是最新的编程语言了,2014wwdc刚刚发布,下面来了解一下都有哪些特点. 首先感谢原作者,主要内容是借鉴他的,参考链接 http://zh.lucida.me/blog/an- ...

  8. [转] tomcat组成及工作原理

    1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet containe ...

  9. 基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr

    请用C语言实现字符串的查找函数strstr, 找到则返回子字符串的地址,没有找到返回为空,请用数组操作与指针操作实现 看到题目想到最简单的方法就是母字符串和子字符串比较,如果不同,将指向母字符串的指针 ...

  10. HDU 2147 kiki's game

    题解:画图可得当横纵坐标均为奇数时为必败态…… #include <cstdio> int main(){ int a,b; while(scanf("%d%d",&a ...