常见的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. 一个 VUE 组件:实现子元素 scroll 父元素容器不跟随滚动(兼容PC、移动端)

    介绍 我们经常遇到一种情况.当滑动滚动条区域时,子元素滚动条到底部或顶部时就会触发父级滚动条,父级滚动条同理会继续向上触发,直至body容器.这是浏览器默认的滚动行为. 但是很多情况,我们想要子元素滚 ...

  2. 洛谷 P2744 [USACO5.3]量取牛奶Milk Measuring

    P2744 [USACO5.3]量取牛奶Milk Measuring 题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最 ...

  3. php持续集成环境笔记

    记录下php集成环境中若干个工具的安装步骤和过程: 安装pear wget http://pear.php.net/go-pear.phar $ php go-pear.phar 使用:pear in ...

  4. [Webpack + React] Import CSS Modules with TypeScript and webpack

    If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webp ...

  5. linux线程间同步(1)读写锁

    读写锁比mutex有更高的适用性,能够多个线程同一时候占用读模式的读写锁.可是仅仅能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,全部试图对这个锁加锁的线程都会被堵塞 ...

  6. Windows API Hook

    原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是由于看了原文.我才学会了HOOK.鉴于原文的排版不是非常好, ...

  7. sass08 if while for each

    scss @function getzIndex($layer: default){ $zindexMap: (default: 1, modal: 1000, dropdown: 500, grid ...

  8. HBase框架基础(三)

    * HBase框架基础(三) 本节我们继续讨论HBase的一些开发常识,以及HBase与其他框架协调使用的方式.在开始之前,为了框架之间更好的适配,以及复习之前HBase的配置操作,请使用cdh版本的 ...

  9. vuejs keep-alive

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Mac上vmware虚拟机Windows10安装JDK8及配置环境

    1.jdk8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.双击下载的jdk进行安装 3.安装成功之 ...