常见的Android 的界面,均采用Activity+view的形式显示的,一提到Activity,立即就能联想到Activity的生命周期与状态的保存。 下面先从Activity的生命周期开始说起 
1.打开Activity:则onCreate()->onStart()->onResume()

2.关闭Activity:则onPause()->onStop()->onDestroy()

3.以上第一步打开Activity后如果按back键(即发生了退回的操作,这个时候应用程序是要关闭的,属于用户主动对Activity销毁)则onPause()->onStop()->onDestroy()

4.以上第一步打开Activity后如果按Home键(即访问手机系统的主菜单界面或者来电等其它原因中断了当前Activity。这个时候因为acvitity是处于不可见的状态,但是没有进行清理销毁的,只是暂停了),于是 onPause()->onStop()

5.以上第四步之后返回或再打开Activity,则onRestart()->onStart()->onResume()

6. 从一个Activity调用另一个Activity的话,则在目标Activity中的onCreate(Bundle savedInstanceState )就多了一个Bundle(就是一个intent,里面包含了该Activity的创建动作和信息),将Activity按照相应的情况创建出来->onStart()->onResume() 之后操作就是一直这样循环的,所有生命周期也就是这样循环的

通过上面的描述,大体上知道了Activity的生命周期

但是,后台Activity的优先级是比较低的,当系统内存等资源不足时,将会把后台的Activity killed 掉,此时界面中的信息将会对丢失,怎么办呢?

Android的设计者早都为我们想好了,怎样处理避免界面信息的丢失。

在Activity中存在两个非常重要的回调方法,onSaveInstanceState(Bundle outState) 和onRestoreInstanceState(Bundle savedInstanceState) 方法,那么是不是只要复写了该方法,就一定会调用呢? 答案是否定的。

下面下从onSaveInsatanceState(Bundle outState) 开始说起,当发生以下状态时,会出发onSaveInstanceState(Bundle outState)方法:

1、当用户按下HOME键时。

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从Activity A中启动一个新的Activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

源码示例:

public class ActivityLife extends Activity {

// 在Activity生命周期开始时被调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("***", "onCreate");
}

// 当activity从停止状态重新启动时调用
@Override
protected void onRestart() {
super.onRestart();
Log.d("***", "onRestart");
}

// 当activity对用户即将可见的时候调用。
@Override
protected void onStart() {
super.onStart();
Log.d("***", "onStart");
}

// onCreate完成后被调用,用来恢复UI状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("***", "onRestoreInstanceState");
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("***", "onActivityResult");
}

// 开始与用户进行交互
@Override
protected void onResume() {
super.onResume();
Log.d("***", "onResume");
}

// Activity即将移出栈顶保留UI状态时调用此方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("***", "onSaveInstanceState");
}

// 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用
// CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
@Override
protected void onPause() {
super.onPause();
Log.d("***", "onPause");
}

// 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
@Override
protected void onStop() {
super.onStop();
Log.d("***", "onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d("***", "onDestroy");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("***", "onConfigurationChanged");
}
}

可视过程的生命周期onStart() 直到onPause(),可交互的生命周期 onResume() 至onPause()

 
 保存activity状态

当系统因为某种原因关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。

保存activity状态有两种方式:

1、onSaveInstanceState

它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(),
 所以它们两个都可以恢复捕获的状态。
 
 那么,在什么时刻会执行onSaveInstanceState方法

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

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

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

说到onSaveInstanceState,那么必须来看看onRestoreInstanceState方法,onRestoreInstanceState只有在Activity确实被系统回收了才会被调用,比如横竖屏切换onRestoreInstanceState就会被执行,一般来说按Home键,再去回到Activity,Acitivity一般不被系统销毁,onRestoreInstanceState也不会被调用。

2、onPause

因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据,因为可能根本保存不了,
 而是应该用onPause()来达到这个目的。

                                                ——转载自http://my.oschina.net/helu/blog/159024

【基础篇】activity生命周期及数据保存的更多相关文章

  1. Activity生命周期,状态保存恢复(经典)

    一.整体框架 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  2. Activity生命周期与状态保存

    弹出系统对话框,程序仍部分可见 onPause 对话框消失时 onResume   调用一个新的Activity,老的Activity不可见时 onPause->onStop 从新的Activi ...

  3. 基础总结篇之一:Activity生命周期[转]

    from:http://blog.csdn.net/liuhe688/article/details/6733407   基础总结篇之一:Activity生命周期 子曰:溫故而知新,可以為師矣.< ...

  4. 基础总结篇之一:Activity生命周期

    子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...

  5. 基础总结篇之中的一个:Activity生命周期

    子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...

  6. 转:基础总结篇之一:Activity生命周期

    熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实android中的Acti ...

  7. [转]基础总结篇之一:Activity生命周期

      子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思 ...

  8. Android学习整理之Activity生命周期篇

    一.Activity生命周期说明   Activity的四种状态: ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能 ...

  9. 【转】Android总结篇系列:Activity生命周期

    [转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...

随机推荐

  1. 30 个实例详解 ,让运维彻底搞清TOP 命令!

    Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...

  2. pandas 2 选择数据

    from __future__ import print_function import pandas as pd import numpy as np np.random.seed(1) dates ...

  3. OpenResty.spec

    Name: openresty Version: 1.13.6.1 Release: 2%{?dist} Summary: OpenResty, scalable web platform by ex ...

  4. 2015年开源项目荣登GitHub十强榜单

    翻译出自:51CTO.com 开源是一个好东西,2015最振奋人心的就是swift开源. <软件开发时代>杂志(SD Times)回想了GitHub上的一些流行项目,这些项目已给开放和自由 ...

  5. XXXfragment that is not a fragment错误,fragment认不出来

    要注意的是fragment事实上是有两个版本号的,一个是 import android.support.v4.app.Fragment; 另外一个是 import android.app.Fragme ...

  6. Block的使用--初探Block

    看了两天的Block. 网上是有非常多解说与教程,也有讲得非常好的.这里就主要解说下我的理解与收获.欢迎拍砖. 所谓block.我觉得应该是一个闭包函数.而闭包,就是说block以及内部全部的变量生命 ...

  7. BZOJ5042: LWD的分科岛

    [传送门:BZOJ5042] 简要题意: 给出n个数,q个询问,每个询问输入opt,l,r,如果opt=1,则输出l到r中的最小值,否则输出最大值 题解: 直接上ST表,自信一波,结果 MLE??好吧 ...

  8. 插入记录INSERT(二十五)

    插入记录INSERT 我们先来看第一个操作:INSERT 实际上在mysql当中一共存在着3种不同的insert语句,我们先来看第一种.它的语法结构如下: 一.插入记录 INSERT [INTO] t ...

  9. 使用 Spring HATEOAS 开发 REST 服务--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-SpringHATEOAS/index.html?ca=drs-&utm_source ...

  10. 数据库表的连接(Left join , Right Join, Inner Join)用法详解

    转自:http://blog.csdn.net/jetjetlinuxsystem/article/details/6663218 Left Join, Inner Join 的相关内容,非常实用,对 ...