# Android Activity **Published by:** [baiyanwu.eth](https://paragraph.com/@baiyanwu/) **Published on:** 2022-03-01 **URL:** https://paragraph.com/@baiyanwu/android-activity ## Content 生命周期整体介绍# 完整流程 onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy # 切到后台时不可见,缓慢切回 onStop -> onRestart -> onStart -> .... # 暂停回来,两个 Activity 快速切回 onPause -> onResume -> ... # 被杀死 onStop -> killed -> onCreate -> .... 各个阶段onCreate: 初始化onStart: 已经可见,但是无法交互onResume: 可见,且可以交互onPause: 暂停,在前台并可见,可以进行暂存数据,不能太耗时onStop: 不可见,无法交互,但还在内存中,未被销毁,进行资源回收onDestroy: 不可见,Activity 进行销毁,进行资源回收onRestart: 重新打开出发几个问题如果所有的初始化都在onCreate()中实现,会有什么问题?初始化的动画是无效的切到后台后 Activity 再次展示(onPause -> onResume ->...),可能需要初始化,此时不会被调用如果所有的初始化都在onStart()中实现,会有什么问题?切到后台后 Activity 再次展示(onPause -> onResume ->...),可能需要初始化,此时不会被调用官方推荐布局设置,view 绑定,放到 onCreate 中如果把所有的去初始化都在onStop()中实现,会有什么问题?在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),所以所有的去初始化操作放在**onStop()**中执行,可能会引出新的问题;在onStop() 的注释中明确地写了,在内存不足而导致系统无法保留此进程的情况下,onStop() 可能都不会被执行。A -> B,会执行什么? A#onPause() -> B#onCreate -> B#onStart -> B#onResume -> A#onStop()任务栈一、四种基础模式 (核心,把握好栈的跳转)standard,标准方式,类似于对象的创建 💡 standard 在同一个栈中时,会创建新的对象singleInstance,全局唯一的栈中的单例,single activity 全局单例 进行接下来的跳转:Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance -> BNormal 💡 补充,此时,一直返回键 经历的过程就是出栈逻辑,同时注意当前一个栈退出以后,后面的栈会补上 BNormal -> BNormal -> ANormal -> Main -> SingleInstance 核心是 SingleInstace 不在同一个栈Main -> ANormal | | | 前台 | | | | | |-----------------------| | | | ANormal | | | |-----------------------| | | | Main | | | |-----------------------| Main -> ANormal -> SingleInstance | | | | | | | | | 后台 | | 前台 | | | | | |-----------------------| |-----------------------| | | | | | ANormal | | | | | | | |-----------------------| |-----------------------| | | | | | Main | | SingleInstance | | | | | |-----------------------| |-----------------------| Main -> ANormal -> SingleInstance -> BNormal 前台 |-----------------------| | | | | | 后台 | | BNormal | | | | | | | |-----------------------| |-----------------------| | | | | | ANormal | | | | | | | |-----------------------| |-----------------------| | | | | | Main | | SingleInstance | | | | onCreate | |-----------------------| |-----------------------| Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance 后台 |-----------------------| | | | | | | | BNormal | | 前台 | | | | | |-----------------------| |-----------------------| | | | | | ANormal | | | | | | | |-----------------------| |-----------------------| | | | | | Main | | SingleInstance | | | | onNewIntent | |-----------------------| |-----------------------| Main -> ANormal -> SingleInstance -> BNormal -> SingleInstance -> BNormal 前台 |-----------------------| | | | BNormal | | | |-----------------------| | | | | | | | BNormal | | 后台 | | | | | |-----------------------| |-----------------------| | | | | | ANormal | | | | | | | |-----------------------| |-----------------------| | | | | | Main | | SingleInstance | | | | | |-----------------------| |-----------------------| singleTask,一个栈中有且仅有一个单例,single activity in task,如果没有 task,会创建,如果有,直接跳转,自带 clearTop 功能,onNewIntent 接收 以下是同一个 Task 中的跳转介绍,关于创建 task 的例子,在 taskAffinity 中会进行举例Main -> ANormal Main -> ANormal -> SingleTask | | | SingleTask | | (onCreate) | |-----------------------| | | | | | ANormal | ========>>>> | ANormal | | | | | |-----------------------| |-----------------------| | | | | | Main | | Main | | | | | |-----------------------| |-----------------------| Main -> ANormal -> SingleTask -> BNormal |-----------------------| | | | BNormal1 | | | |-----------------------| | | | SingleTask | | | |-----------------------| | | | ANormal | | | |-----------------------| | | | Main | | | |-----------------------| Main -> ANormal -> SingleTask -> BNormal -> SingleTask |-----------------------| | | | SingleTask | | (onNewIntent) | |-----------------------| | | | ANormal | | | |-----------------------| | | | Main | | | |-----------------------| Main -> ANormal -> SingleTask -> BNormal -> SingleTask -> BNormal |-----------------------| | | | BNormal2 | | | |-----------------------| | | | SingleTask | | | |-----------------------| | | | ANormal | | | |-----------------------| | | | Main | | | |-----------------------| singleTop,single activity on top,如果要跳转的 Activity 在栈顶,那直接跳转原有 Activity,并且回调 onNewIntent,否则会创建一个新的。 配合 Intent.FLAG_ACTIVITY_CLEAR_TOP,可以模拟 SingleTask 的功能,# 非栈顶,创建新的 ANormal -> SingleOnTop1 -> BNormal -> SingleOnTop2 # 栈顶,复用栈顶 ANormal -> SingleOnTop1(onCreate) -> SingleOnTop1 (onNewIntent) # SingleTask 功能 ANormal -> SingleOnTop1(onCreate) -> BNormal --[Intent.FLAG_ACTIVITY_CLEAR_TOP]--> SingleOnTop1(onNewIntent) 二、 taskAffinity 属性taskAffinity 与 standard 模式配合无用配合 SingleTask 使用 整个跳转流程如下: Main(packagename=io.dove.offer) -> ANormal -> SingleTask2(taskAffinity = io.test, onCreate) -> BNormal(taskAffinity = io.test) -> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer) -> SingleTask2(taskAffinity = io.test, onNewIntent)Main -> ANormal |-----------------------| | | | ANormal | | | |-----------------------| | | | Main | | | |-----------------------| Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) |-----------------------| | | | ANormal | | | |-----------------------| |-----------------------| | | | SingleTask2 | | Main | | (onCreate) | | io.dove.offer | | io.test | |-----------------------| |-----------------------| Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test) |-----------------------| |-----------------------| | | | | | ANormal | | BNormal | | | | | |-----------------------| |-----------------------| | | | SingleTask2 | | Main | | (onCreate) | | | | io.test | |-----------------------| |-----------------------| Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test) -> SingleTask(taskAffinity = io.dove.offer) |-----------------------| | SingleTask | | (onCreate) | | | |-----------------------| |-----------------------| | | | | | ANormal | | BNormal | | | | | |-----------------------| |-----------------------| | | | SingleTask2 | | Main | | (onCreate) | | io.dove.offer | | io.test | |-----------------------| |-----------------------| Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test)-> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer) |-----------------------| | | | BNormal | | | |-----------------------| | SingleTask | | (onCreate) | | | |-----------------------| |-----------------------| | | | | | ANormal | | BNormal | | | | | |-----------------------| |-----------------------| | | | SingleTask2 | | Main | | (onCreate) | | io.dove.offer | | io.test | |-----------------------| |-----------------------| Main -> ANormal -> SingleTask2(taskAffinity = io.test,onCreate) -> BNormal(taskAffinity = io.test) -> SingleTask(taskAffinity = io.dove.offer) -> BNormal(taskAffinity = io.dove.offer) -> SingleTask2(taskAffinity = io.test,onNewIntent) |-----------------------| | | | BNormal | | | |-----------------------| | SingleTask | | (onCreate) | | | |-----------------------| | | | ANormal | | | |-----------------------| |-----------------------| | | | SingleTask2 | | Main | | (onNewIntent) | | io.dove.offer | | io.test | |-----------------------| |-----------------------| 此时返回,SingleTask2 -> BNormal -> SingleTask -> ANormal -> Main 配合 allowTaskReparenting 使用 💡 9.0 以上不适用,重排逻辑触发不确定 8.0 以下可以ANormal(App A) -> BNormal(AppB) |-----------------------| | | | BNormal | | | |-----------------------| | | | ANormal | | | |-----------------------| 此时退回桌面,直接打开 AppB |-----------------------| | | | BNormal | | | |-----------------------| |------------------| | | | | | ANormal | | BMain | | | | | |-----------------------| |------------------- 配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用和 SingleTask 效果一样,会创建新的栈 ## Publication Information - [baiyanwu.eth](https://paragraph.com/@baiyanwu/): Publication homepage - [All Posts](https://paragraph.com/@baiyanwu/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@baiyanwu): Subscribe to updates - [Twitter](https://twitter.com/flyerXu88): Follow on Twitter