Android学习路线_入门篇(三)Acitvity生命周期与启动模式
Android应用开发中核心的四大组件是整体应用的骨架,利用好四大组件才能搭建出一个合理高效的APP。简单了解了Activity之后,我们还需要再深入一下Activity的生命周期与启动模式。
本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(二)四大组件之Acitvity
1. Activity的生命周期
生命周期是指组件的实例对象从创建到销毁可能会被系统调用的一些方法,每个方法的调用都有特定的条件,可以根据需要重写生命周期方法来达到在某些特定时刻执行特定任务的目的。生命周期方法不建议自行调用,应由系统管理。
1.1 生命周期一览
首先需要奉上一张图片:
通过这张图片我们可以看到整个Activity的生命周期流程,同时在这个流程运行的过程中存在一个状态转换的现象:
Activity在生命周期中,经历过各个生命周期方法时,它的状态也在Created、Started、Resumed、Paused、Stopped、Destroyed这六个状态中转变。
1.2 生命周期方法
相信你已经注意到了,流程中有很多方法,那些方法被称作生命周期方法。生命周期方法大多是成对出现的:
- onCreate()和onDestroy(),生命的起始与终结。
- onStart()和onStop(),界面的可见与否。
- onResume()和onPause(),是否可进行交互。
详细了解一下各个生命周期方法:
-
onCreate():第一个调用的方法,通常在该方法中加载布局文件、初始化资源、注册事件与
BroadcastReceiver
等较重的任务。 -
onStart():在
onCreate()
方法后调用,通常在该方法中处理UI的显示控制逻辑,任务不可过重,用户此时无法交互也无法直接看见当前Activity
。 -
onResume():在
onStart()
方法后调用,通常在该方法中进行简单的数据处理与UI控制,如开始动画,只执行轻量任务,方法执行后用户可进行交互并可直接看见当前Activity
。此时,当前Activity
进入Resumed
状态(运行状态),当一个Paused
状态的Activity
重新位于栈顶时(从其他Activity
返回),会再次调用该方法。 -
onPause():当前
Activity
被其他Activity
覆盖时调用,让当前Activity
进入Paused
状态(暂停状态),此时当前Activity
可见但不可交互。通常在此方法中进行简单的数据处理与UI控制,如暂停动画,只执行轻量任务。内存不足且无其他优先级更低的Activity
时,当前Activity
可能会被销毁。当前Activity
重新位于栈顶时(从其他Activity
返回),会调用onResume()
方法。 -
onStop(): 当前
Activity
被其他Activity
完全覆盖(若上层Activity
透明或半透明时,只调用onPause()
方法)时调用,当前Activity
进入Stopped
状态(停止状态),当前Activity
不可见。通常在此方法中处理UI的显示控制逻辑,任务不可过重。内存不足且无其他优先级更低的Activity
时,当前Activity
可能会被销毁。还行当前Activity
重新位于栈顶时(从其他Activity
返回),会调用onRestart()
方法。 -
onRestat(): 当一个
Stopped
状态的Activity
被返回时,该方法被调用,之后再调用onStart()
方法和onResume()
方法进入运行状态。 -
onDestroy(): 当前
Activity
被销毁时调用,通常在该方法中用来执行释放资源等较重的任务。
2. Activity的启动模式
Activity的启动模式总共有四种,在AndroidManifest文件中通过<activity>
标签的launchMode
属性来指定启动模式,不指定的情况下是默认的Standard
标准模式。
2.1 启动的模式
-
Standard:标准模式,
Activity
的默认启动模式。在这种模式下,Activity
可以有多个实例,每次启动Activity
,无论任务栈中是否已经存在这个Activity
的实例,系统都会创建一个新的Activity
实例。 -
SingleTop:栈顶模式,栈顶
Activity
复用的模式。当一个SingleTop
模式的Activity
已经位于栈顶时,再去启动它则不再创建新的实例;如果不在栈顶,无论任务栈中是否已经存在这个Activity
的实例,系统都会创建一个新的Activity
实例。 -
SingleTask:单任务模式,栈内
Activity
复用的模式。如果启动的Activity
已经存在于任务栈中,则会将此Activity
上层的其他Activity
出栈,使此Activity
位于栈顶;否则创建一个新的Activity
实例。 -
SingleInstance:单实例模式。在该模式下,系统会启动一个新的栈来管理该
Activity
,不同应用之间可以共享该Activity
。
2.2 两个Activity跳转时的生命周期
常见的场景就是两个Activity跳转,如A跳转到B,此时A和B的生命周期交织在一起,并不是简单的A执行完所有的生命周期再从头执行B的生命周期。
- 当B无实例,且不是透明或半透明时:A.onPause() > B.onCreate() > B.onStart() > B.onResume() > A.onStop()。
此时从B返回A:B.onPause() > A.onRestart() > A.onStart() > A.onResume() > B.onStop() > B.onDestroy()。 - 当B无实例,且为透明或半透明时:A.onPause() > B.onCreate() > B.onStart() > B.onResume()。
此时从B返回A:B.onPause() > A.onResume() > B.onStop() > B.onDestroy()。
透明的B将导致A被B覆盖时不执行A.onStop()方法,B返回A时也不执行A.onRestart() > A.onStart()这两个方法。接下来的就不考虑透明的情况了,举一反三。
- 当B有实例,B为SingleTop模式,且B位于栈顶(B不位于栈顶时相当于无实例,参考1、2两点):此时A不在栈顶,其生命周期并不执行,B无生命周期变化,但系统会调用B.onNewIntent()方法告知B接收到了新的Intent。
- 当B有实例,B为SingleTask模式:A.onPause() > B.onRestart() > B.onStart() > B.onNewIntent() > B.onResume()(onNewIntent()与onResume()无确定先后顺序,位置可能交换)> A.onStop() > 原本栈内位于B之上的Activity进入销毁流程。
完毕
今天的分享就到这里,文章多有不足,各位小伙伴有什么想法可以直接评论或是私信,要是对你有所帮助就给我一个赞吧,喜欢我的小伙伴可以关注我哦~
本文已收录至☞Android学习路线_梳理
上一篇☞Android学习路线_入门篇(二)四大组件之Acitvity
支持我的小伙伴们可以微信搜索“Android思维库”,或者微信扫描下方二维码,关注我的公众号,每天都会推送新知识~