转载请注明出处:http://www.cnblogs.com/landptf/p/6309108.html

生命周期是个老生常谈的问题了,今天做个汇总,全当是记个笔记,以后查找起来方便一些。下面我将分三个部分来介绍。

为了演示方便我创建了两个Activity:ActivityA ActivityB

除生命周期函数之外也包含了onSaveInstanceState、onRestoreInstanceState、onNewIntent、onConfigurationChanged的回调

1. 特殊场景下的生命周期

1.1 按电源键关屏

01-18 23:16:21.003 7037-7037/com.landptf.blog E/ActivityA: onPause()
01-18 23:16:21.033 7037-7037/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-18 23:16:21.033 7037-7037/com.landptf.blog E/ActivityA: onStop()

1.2 按Home键回到主界面

01-18 23:18:46.413 7037-7037/com.landptf.blog E/ActivityA: onPause()
01-18 23:18:46.693 7037-7037/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-18 23:18:46.693 7037-7037/com.landptf.blog E/ActivityA: onStop()

1.3 按菜单键或长按Home键查看后台程序列表

01-18 23:19:50.093 7037-7037/com.landptf.blog E/ActivityA: onPause()
01-18 23:19:50.173 7037-7037/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-18 23:19:50.173 7037-7037/com.landptf.blog E/ActivityA: onStop()

1.4 Android 7.0 分屏相关

长按后分屏将分别执行

01-18 10:36:50.950 1453-1453/com.landptf.blog E/ActivityA: onDestroy()
01-18 10:36:50.954 1453-1453/com.landptf.blog E/ActivityA: onCreate()
01-18 10:36:50.961 1453-1453/com.landptf.blog E/ActivityA: onStart()
01-18 10:36:50.961 1453-1453/com.landptf.blog E/ActivityA: onRestoreInstanceState()
01-18 10:36:50.962 1453-1453/com.landptf.blog E/ActivityA: onResume()
01-18 10:36:50.962 1453-1453/com.landptf.blog E/ActivityA: onPause()
01-18 10:36:50.995 1453-1453/com.landptf.blog E/ActivityA: onResume()
01-18 10:36:51.831 1453-1453/com.landptf.blog E/ActivityA: onPause()
01-18 10:36:54.355 1453-1453/com.landptf.blog E/ActivityA: onResume()

从log中可以看出,activity先销毁之后重建,并且执行两次焦点切换事件

然后反复点击屏幕上的两个应用焦点将来回切换

01-18 10:39:26.193 1453-1453/com.landptf.blog E/ActivityA: onPause()
01-18 10:39:28.400 1453-1453/com.landptf.blog E/ActivityA: onResume()
01-18 10:39:29.534 1453-1453/com.landptf.blog E/ActivityA: onPause()
01-18 10:39:30.437 1453-1453/com.landptf.blog E/ActivityA: onResume()

注:如果是视频类应用不可以在onPause()方法里暂停

1.5 屏幕旋转

  • 切横屏
01-18 10:44:27.840 1453-1453/com.landptf.blog E/ActivityA: onPause()
01-18 10:44:27.841 1453-1453/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-18 10:44:27.859 1453-1453/com.landptf.blog E/ActivityA: onStop()
01-18 10:44:27.860 1453-1453/com.landptf.blog E/ActivityA: onDestroy()
01-18 10:44:27.871 1453-1453/com.landptf.blog E/ActivityA: onCreate()
01-18 10:44:27.877 1453-1453/com.landptf.blog E/ActivityA: onStart()
01-18 10:44:27.878 1453-1453/com.landptf.blog E/ActivityA: onRestoreInstanceState()
01-18 10:44:27.879 1453-1453/com.landptf.blog E/ActivityA: onResume()

Activity重建

  • 切竖屏

    同上 与切横屏时完全相同的生命周期
  • 设置config为orientation|keyboardHidden|screenSize后切横竖屏
android:configChanges="orientation|keyboardHidden|screenSize"
01-18 11:15:50.523 30577-30577/com.landptf.blog E/ActivityA: onConfigurationChanged()

1.6 内存不足导致被系统回收

当内存不足时会优先将处于后台的Activity回收,ActivityA在后台,ActivityB在前台时,若ActivityA被回收后按Back键返回到ActivityA时,ActivityA会重建,执行过程如下:

01-18 10:36:50.954 1453-1453/com.landptf.blog E/ActivityA: onCreate()
01-18 10:36:50.961 1453-1453/com.landptf.blog E/ActivityA: onStart()
01-18 10:36:50.961 1453-1453/com.landptf.blog E/ActivityA: onRestoreInstanceState()
01-18 10:36:50.962 1453-1453/com.landptf.blog E/ActivityA: onResume()

1.7 新Activity未完全遮挡旧Activity时的生命周期

  • 设置ActivityB的theme为
android:theme="@style/Theme.AppCompat.Dialog"
01-18 11:29:05.977 10621-10621/com.landptf.blog E/ActivityA: onPause()
01-18 11:29:05.980 10621-10621/com.landptf.blog E/ActivityB: onCreate()
01-18 11:29:05.983 10621-10621/com.landptf.blog E/ActivityB: onStart()
01-18 11:29:05.983 10621-10621/com.landptf.blog E/ActivityB: onResume()
  • 在ActivityB的onCreate()方法中添加

    getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    使其背景透明,此时从A启动B,生命周期如下:
01-18 11:41:12.200 22238-22238/com.landptf.blog E/ActivityA: onPause()
01-18 11:41:12.202 22238-22238/com.landptf.blog E/ActivityB: onCreate()
01-18 11:41:12.207 22238-22238/com.landptf.blog E/ActivityB: onStart()
01-18 11:41:12.208 22238-22238/com.landptf.blog E/ActivityB: onResume()

可以看到两种方式的生命周期完全相同,都不会执行ActivityA的onStop()方法

2. 与启动模式相关的生命周期

该博客内容重点不在于讲解Activity的启动模式,有兴趣的同学可以自行学习

  • singleTop

    设置ActivityA的launchMode为singleTop,首次启动ActivityA会执行
01-19 09:58:16.175 11336-11336/com.landptf.blog E/ActivityA: onCreate()
01-19 09:58:16.179 11336-11336/com.landptf.blog E/ActivityA: onStart()
01-19 09:58:16.179 11336-11336/com.landptf.blog E/ActivityA: onResume()

当ActivityA处于栈顶时,再次打开ActivityA后,会执行

01-19 09:58:18.903 11336-11336/com.landptf.blog E/ActivityA: onPause()
01-19 09:58:18.903 11336-11336/com.landptf.blog E/ActivityA: onNewIntent()
01-19 09:58:18.903 11336-11336/com.landptf.blog E/ActivityA: onResume()

首先失去焦点然后回调onNewIntent方法,并没有重建

  • singleTask

    设置ActivityA的launchMode为singleTask执行如下操作

    ActivityA -> ActivityB -> ActivityA

    ActivityA启动
01-19 10:04:49.923 16914-16914/com.landptf.blog E/ActivityA: onCreate()
01-19 10:04:49.927 16914-16914/com.landptf.blog E/ActivityA: onStart()
01-19 10:04:49.927 16914-16914/com.landptf.blog E/ActivityA: onResume()

ActivityB启动,此时ActivityA处于栈底,ActivityB处于栈顶

01-19 10:05:12.023 16914-16914/com.landptf.blog E/ActivityA: onPause()
01-19 10:05:12.027 16914-16914/com.landptf.blog E/ActivityB: onCreate()
01-19 10:05:12.031 16914-16914/com.landptf.blog E/ActivityB: onStart()
01-19 10:05:12.031 16914-16914/com.landptf.blog E/ActivityB: onResume()
01-19 10:05:12.415 16914-16914/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-19 10:05:12.415 16914-16914/com.landptf.blog E/ActivityA: onStop()

再启动ActivityA

01-19 10:05:49.103 16914-16914/com.landptf.blog E/ActivityB: onPause()
01-19 10:05:49.107 16914-16914/com.landptf.blog E/ActivityA: onNewIntent()
01-19 10:05:49.107 16914-16914/com.landptf.blog E/ActivityA: onRestart()
01-19 10:05:49.107 16914-16914/com.landptf.blog E/ActivityA: onStart()
01-19 10:05:49.107 16914-16914/com.landptf.blog E/ActivityA: onResume()
01-19 10:05:49.467 16914-16914/com.landptf.blog E/ActivityB: onStop()
01-19 10:05:49.467 16914-16914/com.landptf.blog E/ActivityB: onDestroy()

前面两步都是正常的执行流程,重点看最后一步,从log中发现ActivityB执行了onDestory方法,因此可以断定ActivityB已经销毁,而ActivityA重建但是并没有执行onCreate方法替代的是onNewIntent方法

  • singleInstance

    设置ActivityA的launchMode为singleInstance执行如下操作

    ActivityA -> ActivityB -> ActivityA

    前两步同上,我们直接看第三步的执行流程,此时ActivityA处于栈底,ActivityB处于栈顶
01-19 10:11:52.963 24180-24180/com.landptf.blog E/ActivityB: onPause()
01-19 10:11:52.963 24180-24180/com.landptf.blog E/ActivityA: onNewIntent()
01-19 10:11:52.963 24180-24180/com.landptf.blog E/ActivityA: onRestart()
01-19 10:11:52.963 24180-24180/com.landptf.blog E/ActivityA: onStart()
01-19 10:11:52.963 24180-24180/com.landptf.blog E/ActivityA: onResume()
01-19 10:11:53.735 24180-24180/com.landptf.blog E/ActivityB: onSaveInstanceState()
01-19 10:11:53.735 24180-24180/com.landptf.blog E/ActivityB: onStop()

可以看出区别在于ActivityB并没有执行onDestroy方法,也就是说ActivityB并没有销毁

此时按Back键返回,ActivityB回到了前台

01-19 10:15:45.947 28069-28069/com.landptf.blog E/ActivityA: onPause()
01-19 10:15:45.951 28069-28069/com.landptf.blog E/ActivityB: onRestart()
01-19 10:15:45.951 28069-28069/com.landptf.blog E/ActivityB: onStart()
01-19 10:15:45.951 28069-28069/com.landptf.blog E/ActivityB: onResume()
01-19 10:15:46.747 28069-28069/com.landptf.blog E/ActivityA: onStop()
01-19 10:15:46.747 28069-28069/com.landptf.blog E/ActivityA: onDestroy()

此时ActivityA已销毁,再次按Back键则返回到主界面

3. 正常流程的生命周期

正常流程上的生命周期,也就是设置launchMode为standard(默认启动模式,可以省略)

首先启动ActivityA

01-19 10:20:36.159 318-318/com.landptf.blog E/ActivityA: onCreate()
01-19 10:20:36.163 318-318/com.landptf.blog E/ActivityA: onStart()
01-19 10:20:36.163 318-318/com.landptf.blog E/ActivityA: onResume()

再启动ActivityB

01-19 10:21:15.323 318-318/com.landptf.blog E/ActivityA: onPause()
01-19 10:21:15.323 318-318/com.landptf.blog E/ActivityB: onCreate()
01-19 10:21:15.327 318-318/com.landptf.blog E/ActivityB: onStart()
01-19 10:21:15.327 318-318/com.landptf.blog E/ActivityB: onResume()
01-19 10:21:15.727 318-318/com.landptf.blog E/ActivityA: onSaveInstanceState()
01-19 10:21:15.727 318-318/com.landptf.blog E/ActivityA: onStop()

这里面注意一点ActivityA的onPause方法在ActivityB的onCreate方法之前执行,因此不要在onPause方法里做耗时操作,否则会影响新Activity的启动时间

按Back键返回到ActivityA

01-19 10:23:32.755 318-318/com.landptf.blog E/ActivityB: onPause()
01-19 10:23:32.755 318-318/com.landptf.blog E/ActivityA: onRestart()
01-19 10:23:32.755 318-318/com.landptf.blog E/ActivityA: onStart()
01-19 10:23:32.755 318-318/com.landptf.blog E/ActivityA: onResume()
01-19 10:23:33.203 318-318/com.landptf.blog E/ActivityB: onStop()
01-19 10:23:33.203 318-318/com.landptf.blog E/ActivityB: onDestroy()

同样是ActivityB的onPause方法先执行

以上便是我能想到的有关Activity生命周期相关的内容,有错误或者不足的地方欢迎大家指出

调试代码已上传github,欢迎访问

Activity生命周期完全解析的更多相关文章

  1. Android Activity生命周期详细解析

    概况 讲Android Activity那怎么都绕不过这张图,这篇文章也是围绕这幅图详细分析. 背景 假设这是你的APP,以此为背景,下面的每个part请结合上图理解. #Case 1 当按下app启 ...

  2. Android全面解析之Activity生命周期

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的.事实上,我猜测每个android开发 ...

  3. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  4. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  5. android --Activity生命周期具体解释

    一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...

  6. [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!

    转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...

  7. Activity生命周期(深入理解)

    今天看到一篇大神总结Activity的文章,内容甚为详细,特此转载http://www.cnblogs.com/lwbqqyumidi/p/3769113.html Android官方文档和其他不少资 ...

  8. Android Activity生命周期

    从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态  activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...

  9. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

随机推荐

  1. 编译内核启用iptables及netfilter

    在Network Packet Filtering Framework(Netfilter)一节中还有两个额外的配置节——Core Netfilter Configuration(核心Netfilte ...

  2. 可用类型的几何对象esriGeometryType Constants

    The available kinds of geometry objects. Constant Value Description esriGeometryNull 0 A geometry of ...

  3. POJ 1584 A Round Peg in a Ground Hole

    先判断是不是N多边形,求一下凸包,如果所有点都用上了,那么就是凸多边形 判断圆是否在多边形内, 先排除圆心在多边形外的情况 剩下的情况可以利用圆心到每条边的最短距离与半径的大小来判断 #include ...

  4. Classification of text documents: using a MLComp dataset

    注:原文代码链接http://scikit-learn.org/stable/auto_examples/text/mlcomp_sparse_document_classification.html ...

  5. iOS进阶

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:wjh2005链接:https://www.zhihu.com/question/28518265/answer/887505 ...

  6. js局部变量,参数

    作者:zccst 所有函数的参数都是按值传递的.也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样.基本类型值的传递如同基本类型变量的赋值一样.而引用类型值的传递,则 ...

  7. DDR工作原理(转)

    源:DDR工作原理 DDR SDRAM全称为Double Data Rate SDRAM,中文名为“双倍数据流SDRAM”.DDR SDRAM在原有的SDRAM的基础上改进而来.也正因为如此,DDR能 ...

  8. XCode 7上传遇到ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法

    去第三方的info.plist文件中,比如TencentOpenApi_IOS_Bundle.bundel 的info.plist ,删除 executable file 这一行

  9. iOS 开发之动画篇 - 从 UIView 动画说起

    毋庸置疑的:在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的. 本文作为动画文集的第一篇, ...

  10. SQLite用法

    SQLite语法:http://blog.csdn.net/ejzhang/article/details/6224915#08 SQLite查询优化:1.http://www.eoeandroid. ...