整理分析 WMS/AMS 流程中经常出现的公用代码逻辑。
以Activity启动流程 TaskDisplayArea::pauseBackTasks 调用为例。
forAllLeafTasks方法定义在WindowContainer类中,TaskDisplayArea是容器,自然也是其子类
1 | scss复制代码# WindowContainer |
TaskDisplayArea的孩子是 Task,从堆栈信息也知道会调用到 Task::forAllLeafTasks
1 | ini复制代码# Task |
LeafTask表示是否为叶子Task,根据代码也知道就是下面没有Task了。
小结
综上forAllLeafTasks其实就是执行对当前容器下每个叶子Task执行参数的回调,那如果有多个叶子Task必然是执行多次。
以Activity启动流程 TaskDisplayArea::pauseBackTasks,参考forAllLeafTasks的调用。
1 | ini复制代码# WindowContainer |
与forAllLeafTasks一样,也是调用每个子容器的forAllLeafTaskFragments,具体调用到TaskFragment
1 | ini复制代码# TaskFragment |
小结
综上其实就是执行对当前容器下每个叶子TaskFragment执行参数的回调,那如果有多个叶子TaskFragment必然是执行多次。
以Activity启动流程为例
ClientTransaction 通用逻辑
ActivityTaskSupervisor::realStartActivityLocked 构建 LaunchActivityItem
ClientLifecycleManager::scheduleTransaction
ClientTransaction::schedule
ActivityThread::scheduleTransaction
ClientTransactionHandler::scheduleTransaction —ActivityThread的父类,发送消息EXECUTE_TRANSACTION
ActivityThread::handleMessage —处理消息EXECUTE_TRANSACTION
TransactionExecutor::execute
TransactionExecutor::executeCallbacks —处理 Callbacks ,比如LaunchActivityItem
ClientTransactionItem::execute – ClientTransactionItem 只是父类,具体看具体传递的对象
ClientTransactionItem::postExecute
TransactionExecutor::executeLifecycleState —处理生命周期状态相关,也就是 ResumeActivityItem 这些
以 Activity启动的调用 ActivityTaskSupervisor::realStartActivityLocked为例
4.1 容器的 forAllRootTasks 流程
起点为WindowContainer.forAllRootTasks
1 | arduino复制代码# WindowContainer |
其实就是相当于在 Task 这个容器里, 去调用传进来的接口回调。这个接口定义如下
1 | csharp复制代码# Consumer |
所以这部分的逻辑只需要看调用 forAllRootTasks 时 看传递进来的接口实现类是哪一个,找打对应的的 accept 或者 test函数即可,另外注意的是泛型参数都是 Task
4.2容器的 forAllActivities 流程
这个是处理 Activity 的, 而 Activity 对于的容器 一般就是 ActivityRecord
1 | typescript复制代码# WindowContainer |
目前也只有 ActivityRecord 重写了 forAllActivities
1 | typescript复制代码# ActivityRecord |
可以看到逻辑与forAllRootTasks类似, 找到对应类型的接口看 对应的 accept或者test方法实现即可,泛型参数都是 ActivityRecord
本文转载自: 掘金