Activity的生命周期

Posted by Chejdj Blog on April 1, 2018

本文绝大部分内容都是来自《Android艺术探索》,我只是记笔记并且在电脑打log验证,方便自己看

生命周期介绍

(1) onCreate: 表示Activity正在被创建
(2) onRestart: 表示Activity正在重新启动。一般情况下,当当前的Activity从不可见的状态变成可见状态时,onRestart就会调用,比如用户按Home键切换到桌面或则用户打开了一个新的Activity,这时当前的Activity就会暂停,onPause和onStop执行,接着用户又回来,就会出现这种情况
(3) onStart: 表示Activity正在被启动,即将开始,这时Activity已经可见,但是没有出现在前台,还无法交互
(4)onResume: 表示Activity已经可见,并且出现在前台,这个和onStart区别是onStart还在后台
(5)onPause: 表示Activity正在停止,正常情况下,onStop就会调用,如果Activity快速回到当前Activity,那么onResume就会调用,onPause必须执行完,新的Activity才会执行。
(6)onStop:表示Activity即将停止,可以做一些稍微轻量级的工作
(7)onDestory:表示Activity即将销毁,可以做资源释放等 说明:
(1) 一个特定的Activity,第一次启动, onCreate->onStart->onResume
(2) 打开新的Activity或则切换到桌面的时候,onPause->onStop,但是如果新的界面用透明主题,就不会调用onStop,下次再回到的时候,直接调用onResume可以见下面的log日志
(3) 切换回来的时候(默认调用了onStop) onRestart->onStart->onReusme
(4) 如果按了back键,onPause->onStop->Destory

特殊情况下的生命周期

  1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
    对于图片Drawable文件,夹drawable-mdpi,drawable-hdpi,drawable-land,系统根据当前设备的情况去加载合适Resources资源,横屏或则竖屏的时候会拿到两张不同图片(如果不想要在横屏切换时创建Activity就要指定android:configChanges=”orientation”)
    解析:当资源改变的时候,Activity会被销毁,onPause->onStop->onDestory调用,同时由于Activity在异常情况终止,系统又会调用onSaveInstanceState保存当前Activity的状态(onStop之前,只有Activity在异常的情况下才会调用onSaveInstanceState),当Activity重新创建的时候调用onRestoreInstanceState(onStart之前)

  2. 内存不足,导致低优先级的Activity被杀死
    和前面一样

Activity的四种启动模式

首先我们需要知道什么是Activity所需的任务栈。
Activity的一个参数TaskAffinity,这个参数标识了Activity所需要的任务栈的名字,默认的情况下,所有的Activity所需的任务栈的名字为
应用的包名
TaskAffinity属性主要和singleTask启动模式或则allowTaskReparenting属性配对使用。
任务栈分为前台任务栈后台任务栈,后台任务栈中的Activity位于暂停状态onPause。后台任务栈通过切换将后台任务栈再次调到前台,如果设置了TaskAffinity和singleTask,待启动的Activity会运行在和Taskffinity相同的任务栈中

  1. standard:标准模式,每启动一个Activity都会重新创建一个新的实例,在这个模式下,谁启动了这个Activity那么这个Activity就运行在启动它的Activity所在的栈中
  2. singleTop: 栈顶复用模式,如果新的Activity位于任务栈的栈顶,那么Activity不会被重新创建,同时它的onNewIntent会回调(面试被问过)(可以通过onNewIntent取出当前请求的信息)
    应用场景:一般运用于通知栏点击通知,然后启动Activity,该Activity就是singleTop模式

  3. singleTask: 栈内复用模式,只要一种Activity在一个栈中存在,那么多次启动Activity都不会重新创建实例,和singleTop一样,系统也会回调onNewIntent方法.启动步骤:启动Activity A,系统首先寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建A所在的实例把A放进栈中,如果存在A所需的任务栈,看栈中是否有实例存在,存在就把A调到栈顶,并调用onNewIntent方法,如果实例不存在,就创建A实例并把A压入栈中。(这里注意是 A想要的任务栈!!!!而不是遍历所有的栈看是否有存在A的栈)
    应用场景: 绝大多数的APP主页,因为我们在主页按back键退出整个应用,clearTop功能,当返回主页的时候
  4. singleInstance: 单实例模式。具有此种模式的Activity只能单独的位于一个任务栈中
    应用场景:呼叫来电界面 一般就是让你的Activity只存在一个实例

思考一个问题: A为Standard,B,C为singleTask(指定了栈和原先的不一样),A启动B,B启动C,C启动A,A启动B,之后按两次back键,就会退回桌面,解释原因?
启动A ,standard中有A,然后B,创建B所需的栈,压入B,启动C,压入C,启动A,压入A(启动的Activity在被启动的Activity所在的栈中),然后A有启动B,A,C出栈,只剩下singleTask指定的栈里面的B,和Standard栈中的A,一次back,B出栈,回到后台栈standard,back把A出栈就回到桌面了