type
status
date
slug
summary
tags
category
icon
password
在分析源码之前,先想一下大概有哪些疑问:
  • Activity是如何加载的?
  • Activity为什么必须在Manifest文件中注册?
  • Activity的本质是什么,可以不需要Activity实现Android APP吗?
  • Activity的生命周期是如何调度的?
  • Activity的启动模式的原理

源码中常见的类

  • ActivityRecord
    • 表示一个Activity,与Activity是一一对应的关系
  • ActivityStack
    • 即Activity栈,管理Activity的状态
  • RootActivityContainer
    • 一个暂时分离出来的类,主要就是一些不应该放到ActivityStackSuperVisor中的功能,可能后面会合并到RootWindowContainer中

Binder调用前

由于之前分析过一些代码的调用流程,这里从ActivityStackSupervisor#startSpecificActivityLocked()开始:
之前说过,创建APP进程的时候走的是下面那个逻辑,这里启动Activity的时候看realStartActivityLocked方法:
看一下调度事务的代码:

ActivityThread.ApplicationThread中的调度过程

现在进入了ApplicationThread中:
ActivityThead实现了ClientTransactionHandler:
这里的mActivityCallback即上面添加的LaunchActivityItem,因此会先执行它的preExecute方法:
这里就是更新下信息,没什么大不了的,看来还是分析下面的这一句比较重要:
ActivityThread.H中有:
继续看:
这下思路清晰了:
  1. 先执行LaunchActivityItem中的executepostExecute方法
  1. 再执行ResumeActivityItem中的executepostExecute方法

Launch

看下LaunchActivityItem的指令:
这下进入到了ActivityThread中的handleLaunchActivity方法了:
这下进入了启动Activity的核心实现代码了:
这里主要干了下面这几件事:
  1. 为目标Activity创建Context
  1. 使用ClassLoader加载Activity类并实例化
  1. 使用ClassLoader加载Application并实例化,调用attach()和onCreate()方法
  1. 执行Activity的attach() 方法并为Activity设置主题
  1. 使用Instrumentation执行Activity的onCreate()回调
Application和Activity代码的加载和实例化入口都在Instrumentation中:
实例化其实都是反射调用:

Activity.onCreate()

至于Activity的onCreate()回调,也在Instrumentation中进行:
到这里onCreate()回调就被调用了.
再来看下onResume()回调的调用吧

Activity.onResume()

还是回到之前的ResumeActivityItem中:
还是Binder调用到ActivityThread中:
到这里Activity启动流程就分析完了.

总结

  1. 基于ClientTransaction的消息传递机制,通过Binder调用到ActivityThread中的方法
  1. ActivityThread中会使用InstrumentationHandler去执行各种逻辑
  1. LoadedApkInstrumentaion负责Application的创建和实例化
  1. Instrumentation负责Activity的创建和实例化
  1. Application和Activity的创建和实例化其实都是利用的Classloader和反射机制
  1. 四大组件的实例化代码都在AppComponentFactory
Activity状态的保存和重建Android中的显示布局边界
Loading...