整体介绍
# 完整流程 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 与 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 效果一样,会创建新的栈

