从点击图标到 HomeActivity.onCreate() 完整链路

一、分层架构总览

二、详细时序图(Mermaid)

三、逐步骤对象生命周期

步骤①-②:触摸 → Launcher 启动

步骤③-④:AMS 决策 → Zygote fork

步骤⑤:Zygote 子进程 → ActivityThread.main()

步骤⑥-⑦:AMS 响应接入 → 发 ClientTransaction

步骤⑧-⑨:App 进程收包 → TransactionExecutor 分发

步骤⑩:核心——Activity 对象诞生

步骤⑪-⑬:HomeActivity.onCreate() → 构建 View Tree

步骤⑭-⑯:onCreate 返回后 → 窗口可见

四、关键对象生命周期

对象

创建时机

创建者

生存期

Looper (主线程)

ActivityThread.main()

Looper.prepareMainLooper()

进程存活期间

ActivityThread

ActivityThread.main()

new ActivityThread()

进程存活期间

Application

第一个 Activity 启动前

makeApplicationInner()

进程存活期间

HomeActivity

performLaunchActivity()

ClassLoader.newInstance()

直到 onDestroy() 后 GC

PhoneWindow

activity.attach()

Policy.makeNewWindow()

与 Activity 同生命周期

DecorView

setContentView()

PhoneWindow.installDecor()

与 Activity 同生命周期

View Tree (所有子View)

setContentView()

LayoutInflater.inflate()

与 DecorView 同生命周期

ViewRootImpl

handleResumeActivity()

ViewRootImpl 构造

直到 Window 被移除

五、Binder 通信总结

整个流程中发生了3 次关键 Binder IPC

次数

方向

调用

作用

1

Launcher → AMS

startActivity()

发起启动请求

2

App → AMS

ActivityThread.attach()

报告进程就绪

3

AMS → App

scheduleTransaction(ClientTransaction)

下发 LaunchActivityItem + ResumeActivityItem

六、你的 HomeActivity 代码在这个链路中的位置

// HomeActivity.java —— 在步骤⑫被调用 public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // ← Activity.performCreate() 第8595行调用 super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); // ← 触发 PhoneWindow 构建 View Tree findViewById(R.id.entry_side_mirr).setOnClickListener(v -> startActivity(new Intent(this, SideMirrActivity.class))); // 点击后又从步骤②重新走一遍 findViewById(R.id.entry_whl).setOnClickListener(v -> startActivity(new Intent(this, WhlActivity.class))); findViewById(R.id.entry_hvac).setOnClickListener(v -> startActivity(new Intent(this, HvacActivity.class))); } }

你的代码里每一行findViewById都依赖于LayoutInflater.inflate()已经在setContentView()PhoneWindow.setContentView()中完成了activity_home.xml的全部 View 构建。这些 View 在onCreate中已经存在于内存并挂载到 DecorView 树下,但此时屏幕还没渲染——渲染要等到onResume之后的makeVisible()+performTraversals()