Activity启动流程

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
  • ActivityManagerServices
    简称AMS,服务端对象,负责系统中所有Activity的生命周期。

  • ActivityStackSupervisor
    管理activity任务栈,内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个Activity栈。其中,mHomeStack管理的是Launcher相关的Activity栈;mFocusedStack管理的是当前显示在前台Activity的Activity栈;mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。

  • ActivityStack
    Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。

  • ActivityRecord
    ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息,其实就是服务器端的Activity对象的映像。

  • TaskRecord
    AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。


  • ApplicationThread
    用来实现AMS和ActivityThread之间的交互。在AMS需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。

  • ApplicationThreadProxy
    ApplicationThread 在服务端的代理,AMS就是通过该代理与ActivityThread进行通信的。

  • ActivityThread
    App的真正入口,当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。

  • Instrumentation
    仪表盘,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。负责调用
    Activity和Application生命周期。测试用到这个类比较多。AMS是董事会,负责指挥和调度的,ActivityThread是老板,虽然说家里的事自己说了算,但是需要听从AMS的指挥,而Instrumentation则是老板娘,负责家里的大事小事,但是一般不抛头露面,听一家之主ActivityThread的安排。

3 Activity启动过程阶段

Launcher启动Activity过程.png

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

  • Launcher.startActivitySafely //首先Launcher发起启动Activity的请求
  • Activity.startActivity
  • Activity.startActivityForResult
  • Instrumentation.execStartActivity //交由Instrumentation代为发起请求
  • ActivityManager.getService().startActivity //通过IActivityManagerSingleton.get()得到一个AMP代理对象
  • ActivityManagerProxy.startActivity //通过AMP代理通知AMS启动activity

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

  • ctivityManagerService.startActivity
  • ActivityManagerService.startActivityAsUser
  • ActivityStackSupervisor.startActivityMayWait
  • ActivityStackSupervisor.startActivityLocked :检查有没有在AndroidManifest中注册
  • ActivityStackSupervisor.startActivityUncheckedLocked
  • ActivityStack.startActivityLocked :判断是否需要创建一个新的任务来启动Activity。
  • ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity。
  • ActivityStack.startPausingLocked
  • ApplicationThreadProxy.schedulePauseActivity

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

  • ApplicationThread.schedulePauseActivity
  • ActivityThread.queueOrSendMessage
  • H.handleMessage
  • ActivityThread.handlePauseActivity
  • ActivityManagerProxy.activityPaused

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

  • ActivityManagerService.activityPaused
  • ActivityStack.activityPaused
  • ActivityStack.completePauseLocked
  • ActivityStack.resumeTopActivityLocked
  • ActivityStack.startSpecificActivityLocked
  • ActivityManagerService.startProcessLocked
  • Process.start //在这里创建了新进程,新的进程会导入ActivityThread类,并执行它的main函数

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

  • ActivityThread.main
  • ActivityThread.attach(false) //声明不是系统进程
  • ActivityManagerProxy.attachApplication

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

  • ActivityManagerService.attachApplication //AMS绑定本地ApplicationThread对象,后续通过ApplicationThreadProxy来通信。
  • ActivityManagerService.attachApplicationLocked
  • ActivityStack.realStartActivityLocked //真正要启动Activity了!
  • ApplicationThreadProxy.scheduleLaunchActivity //AMS通过ATP通知app进程启动Activity

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

  • ApplicationThread.scheduleLaunchActivity //ApplicationThread发消息给AT
  • ActivityThread.queueOrSendMessage
  • H.handleMessage //AT的Handler来处理接收到的LAUNCH_ACTIVITY的消息
  • ActivityThread.handleLaunchActivity
  • ActivityThread.performLaunchActivity
  • Instrumentation.newActivity //调用Instrumentation类来新建一个Activity对象
  • Instrumentation.callActivityOnCreate
  • MainActivity.onCreate
  • ActivityThread.handleResumeActivity
  • AMP.activityResumed
  • AMS.activityResumed(AMS进程)

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启动过程分析

你可能感兴趣的:(Activity启动流程)