Activity 基础知识
- 生命周期
- Activity 栈
生命周期
- 整体介绍
# 完整流程
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 | | | | | |-----------------------| |-----------------------| 此时返回,整个过程 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 使用
- 配合 allowTaskReparenting 使用
- 配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用
-
配合 SingleTask 使用,先给出整个跳转流程:
**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)
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 = true 使用
9.0 以上不适用,重排逻辑触发不确定
8.0 以下可以
ANormal(App A) -> BNormal(AppB) |-----------------------| | | | BNormal | | | |-----------------------| | | | ANormal | | | |-----------------------| 打开 AppB |-----------------------| | | | BNormal | | | |-----------------------| |-----------------------| | | | | | ANormal | | BMain | | | | | |-----------------------| |-----------------------|
-
配合 Intent.FLAG_ACTIVITY_NEW_TASK 使用,和 SingleTask 效果一样,会创建新的栈
-