android基础知识

Activity启动流程

2020-03-24  本文已影响0人  9283856ddec1

1 前言

日常开发过程中我们经常调用startActivity(..)启动新的Activity,那么系统是如何找到这个Activity,Activity的启动模式的启动模式在什么地方发挥作用,以及如何控制两个Activity的生命周期的,这些值得深入源码中去探索下。

2 Activity启动整体过程

Activity启动整体流程.png
  1. 点击桌面app图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
  2. system_server进程接收到请求后,向zygote进程发送创建新进程的请求;
  3. zygote进程fork出新的子进程,即App进程;
  4. App进程通过Binder IPC向system_server进程发起attach Application请求;
  5. system_server收到请求后,进行一系列的准备后,再通过Binder IPC向App进程发送scheduleLaunchActivity请求;
  6. App进程的ApplicationThread收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
  7. 主线程在收到Message后,创建目标Activity,并回调Activity.onCreate()等方法;

注意:App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信,Zygote创建一个套接字,监听ams发过来的fork请求。

2.1 启动过程涉及的主要类

frameworks/base/services/core/java/com/android/server/am/
  - ActivityManagerService.java
  - ActivityStackSupervisor.java
  - ActivityStack.java
  - ActivityRecord.java
  - ProcessRecord.java

frameworks/base/core/java/android/app/
  - IActivityManager.java
  - ActivityManagerNative.java (内含ActivityManagerProxy)
  - ActivityManager.java

  - IApplicationThread.java
  - ApplicationThreadNative.java (内含ApplicationThreadProxy)
  - ActivityThread.java (内含ApplicationThread)
  - Instrumentation.java
  - ContextImpl.java

3 Activity启动过程阶段

Launcher启动Activity过程.png
Activity启动流程(从Launcher开始):
第一阶段: Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)

第二阶段:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity(在AMS所在进程执行)

第三阶段: pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)

第四阶段:检查activity所在进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Process.start创建一个新进程(执行在AMS进程)

第五阶段: 创建ActivityThread实例,执行一些初始化操作,并绑定Application。如果Application不存在,会调用LoadedApk.makeApplication创建一个新的Application对象。之后进入Loop循环。(执行在新创建的app进程)

第六阶段:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)

第七阶段: 加载MainActivity类,调用onCreate声明周期方法(执行在新启动的app进程)

4 Activity启动代码分析

Activity启动流程详图.png

Activity的启动过程主要会涉及五个进程:Launcher进程、System_server进程、当前的前台进程、待启动的Activity所在进程、Zygote进程, 在上图中已有所体现。
具体源码分析见参考资料[5]和[10]

参考资料:

[1] Activity启动流程
[2] Activity 启动全过程解析
[3] Android的Activity启动流程分析
[4] Activity 启动流程
[5] 一张图表示Activity启动流程-- Activity启动流程详解 ★★
[6] 3分钟看懂Activity启动流程
[7] 说说Activity的启动流程
[8] Android进程启动过程 & Activity显示过程
[9] 庖丁解牛 Activity 启动流程
[10] startActivity启动过程分析

上一篇下一篇

猜你喜欢

热点阅读