四大组件之Activity(一)-启动过程概览

本文针对Activity的启动主线进行梳理。先捋大流程,后续再针对细节进行学习。

一、概览关键流程

《四大组件之Activity(一)-启动过程概览》 form Gityuan

启动流程关键主线梳理:

  1. 点击桌面App图标,Launcher进程采用Binder IPC向AMS发起startActivity请求;

  2. AMS接收到请求后,向zygote进程发送创建进程的请求,由Zygote进程fork出新的子进程,即App进程;

  3. App进程,通过Binder IPC向AMS发起attachApplication请求;

  4. AMS在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;

  5. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

  6. 主线程在收到Message后,创建目标Activity,并回调Activity.onCreate()等方法。

到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

二、详细调用流程

下面再看看详细的Activity启动流程(包括top activity切换与activity stop过程) :

《四大组件之Activity(一)-启动过程概览》

Activity启动主要牵扯到两个进程 :app进程 与 system_server进程。按Binder IPC切换划分为如下几个节点:

  1. app 触发activity的启动流程。
    点击桌面App图标,Launcher进程采用Binder IPC向AMS发起startActivity请求。

  2. system_server 接收activity启动请求,开始做一些前期准备工作。

  • 获取对应Activity,并对基本信息进行验证。
  • 根据launcheMode和Flag配置task。
  • 如果之前存在前台Acitivity,则让它先进入pause状态。
  1. app 让之前前台显示的activity进入pause状态。
    这部分很简单,看流程图就足够。

4 system_server 进程准备。
ActivityStackSupervisor #startSpecificActivityLocked
判断当前要启动的activity所在的进程是否存在,如果不存在则创建进程。

5 app ActivityThread 通过消息机制来处理Activity的Launch

6 system_server activity stop时,调整task。

7 app 通知app执行stop回调。

三、执行流
  • Activity要通知系统进程
    Activity–>Instrumentation–>ActivityManagerNative—>
    Binder IPC 进入系统进程
    –>ActivityManagerService–>ActivityStackSupervisor/ActivityStack

  • 系统进程要管理Activity
    ApplicationThreadNative–>
    Binder IPC 进入App进程
    –>ActivityThread.ApplicationThread–>ActivityThread.H–>Instrumentation–>Activity

  • Activity A 启动 Activity B
    生命周期相关的整个过程是:a.onPause()–>b.onCreate()–>b.onStart()–>b.onResume()–>a.onStop()

从整个Activity流程看,主要能拆分为如下几个关键段:

  1. Activity的task/stack管理
  2. Zygote fork 进程的过程
  3. 应用层Activity启动流程
    另外,starting Window流程也可以了解下。

先写这么多,后续慢慢总结。

    原文作者:ZHTo0
    原文地址: https://www.jianshu.com/p/17c37233ca4e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞