常见的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. PHP JWT初识

    一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt.才发现jwt已经被大家广泛的应用了.看来我有点out了.哈哈,趁着这个世界来好好看看这个. JWT(JSON Web Token ...

  2. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)

    参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久 ...

  3. HDU 4725 The Shortest Path in Nya Graph

    he Shortest Path in Nya Graph Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged o ...

  4. ASP.NET-ajax.BeginForm使用02

      Ajax.BeginForm中OnFailure.Onsuccess.OnComplete函数是可以处理从后台返回的数据的,比直接使用jquery的$.ajax方法还要节约时间   @using( ...

  5. Getting started with Kentico

    https://docs.kentico.com/k10tutorial 主面板按照功能分成两行排版 https://docs.kentico.com/k10tutorial/getting-star ...

  6. 前端到后台ThinkPHP开发整站--php开发案例

    前端到后台ThinkPHP开发整站--php开发案例 总结 还是需要做几个案例,一天一个为佳,那样才能做得快. 从需求分析着手,任务体系要构建好,这样才能非常高效. 转自: 前端到后台ThinkPHP ...

  7. 2.LINUX常用命令

    Linux 必备指令摘要一般用户指令/bin 指令 功能说明 范例 bash GNU Bouren-Again Shell bash shell_script cat 观看一般文本文件 cat fil ...

  8. 搭建Hadoop的全分布模式

    此教程仅供参考 注意:此文档目的是为了本人方便以后复习,不适合当教程,以免误导萌新... 1.安装三台Linux2.在每台机器上安装JDK3.配置每台机器的免密码登录 (*) 生成每台机器的公钥和私钥 ...

  9. Vue不能检测的数组变化 对象变化

    数组: 由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue 当你修改数组的长度时 ...

  10. 新机器的vim配置

    最近一直用vim去写acm代码,算是一种练习吧. 用着用着感觉不错,最近也稍微配置了一下vim,用着更舒服了 键盘映射 ESC<->CapsLock 我们知道vim有自带的键盘映射命令,但 ...