Activity生命周期完全解析
转载请注明出处: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生命周期完全解析的更多相关文章
- Android Activity生命周期详细解析
概况 讲Android Activity那怎么都绕不过这张图,这篇文章也是围绕这幅图详细分析. 背景 假设这是你的APP,以此为背景,下面的每个part请结合上图理解. #Case 1 当按下app启 ...
- Android全面解析之Activity生命周期
前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的.事实上,我猜测每个android开发 ...
- 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- android --Activity生命周期具体解释
一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...
- [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!
转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...
- Activity生命周期(深入理解)
今天看到一篇大神总结Activity的文章,内容甚为详细,特此转载http://www.cnblogs.com/lwbqqyumidi/p/3769113.html Android官方文档和其他不少资 ...
- Android Activity生命周期
从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态 activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...
- Android Activity生命周期详讲
管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...
随机推荐
- Modbus RTU 通信工具设计(转)
Modbus RTU 通信工具设计 Modbus 是一个工业上常用的通讯协议.一种通讯约定. ModBus 协议是应用层报文传输协议(OSI 模型第7层),它定义了一个与通信层无关的协议数据单元(PD ...
- PAT (Advanced Level) 1020. Tree Traversals (25)
递归建树,然后BFS一下 #include<iostream> #include<cstring> #include<cmath> #include<algo ...
- DNS架设准备+申请领域查询授权
1. 架设DNS服务器首先我们得安装一下的软件[root@bogon ~]# rpm -qa | grep ^bindbind-libs-9.8.2-0.37.rc1.el6.i686 <==给 ...
- iOS开发——NSArray中的字符串排序
NSArray *arr = @[@"fjhsf",@"wert",@"fdg",@"asd",@"fs g ...
- HMM 隐马尔科夫模型
参考如下博客: http://www.52nlp.cn/itenyh%E7%89%88-%E7%94%A8hmm%E5%81%9A%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8 ...
- Spring--注入类型--setter
setter注入: package com.bjsxt.service; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; publ ...
- 128階數的Shunt音量控制器
源:128階數的Shunt音量控制器 紅外線遙控 - 256階Shunt音量及控制及音源 選擇器
- 实现基本TCP套接字客户端
//实现基本TCP套接字客户端var net = require('net');function getConnection(connName){ var client = net.connect({ ...
- 批量检查APK是否具有指定的权限。
为测试组的妹子提供的. 效果如下: 目录结构如下: 源代码思路: 1.将apk文件变为zip文件.这里是修改后缀 2.解压文件到指定目录.可以只解压其中mainfest.xml文件 3.移动xml文件 ...
- PHP 安装使用 gearman
1.安装服务器端: 官方下载,请到https://launchpad.net/gearmand. yum install boost-devel* gperf* libevent-devel* lib ...