分析流程基于Android8.0源码

一般情况下我们通过Activity中的startActivity方法启动一个Activity。这个流程中涉及一下几个类:

android.app.Activity
android.app.Instrumentationcom.android.server.am.ActivityManagerService
com.android.server.am.ActivityStarter
com.android.server.am.ActivityStackSupervisorandroid.app.ActivityThread
android.app.ActivityThread$ApplicationThread

通过下图了解一下各个类之间的调用关系

整个流程如上图所示,多数代码直接跟着进就可以看到,这里主要说一下两次IPC,通过每个类的包名可以间接反映出整个启动过程是一个C/S结构的跨进程操作。第一次跨进程是在Instumentation内部调用ActivityManagerService的startActivity方法时,代码如下:

int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);

看一下ActivityManager:

public static IActivityManager getService(){return IActivityManagerSingleton.get();
}private static final Singleton<IActivityManager> IActivityManagerSingleton =new Singleton<IActivityManager>() {@Overrideprotected IActivityManager create(){final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);final IActivityManager am = IActivityManager.Stub.asInterface(b);return am;}};

这里通过ServiceManager.getService(Context.ACTIVITY_SERVICE)返回一个IActivityManager,就是一个ActivityManagerService,IActivityManager在/frameworks/base/core/java/android/app/目录下,是一个AIDL文件,里边声明了startActivity方法

interface IActivityManager{...int startActivity(...);...
}

ActivityManagerService继承了IActivityManager.Stub,实现StartActivity方法。这个方法的调用是在系统进程,之后的逻辑在系统进程里执行。


中间跟踪的代码如图,到ActivityStackSupervisor类中的realStartActivityLocked方法:

final boolean realStartActivityLocked(...) throws RemoteException{...app.thread.scheduleLaunchActivity();...
}

这里app.thread是一个ApplicationThread对象,ApplicationThread是ActivityThread的一个内部类,看一下ApplicationThread的相关代码:

private class ApplicationThread extends IApplicationThread.Stub{@Overridepublic final void scheduleLaunchActivity(...){...}

ApplicationThread继承了IApplicationThread.Stub,这里也是跨进程的一步,这个时候就从系统进程回到了应用自己的进程,然后通过反射获取Activity实例,实例化Context,并调用获取Activity实例的attach方法,传入Context。最后调用到Activity的声明周期的方法。

总结:应用内启动Activity的逻辑主要经历了两次的跨进程过程,首先从应用自己进程跨进程到系统进程,处理Activity创建过程中的标志位判断,Activity所在的ActivityStack判断、初始化,等等,最后跨进程会应用自己进程实例化Activity,并调用Activity的生命周期方法。

Android源码分析:Activity启动流程相关推荐

  1. Android 源码分析 Activity的启动模式

    一直想抽空针对AMS进行源码分析,无奈一方面因为很忙,另外AMS很复杂,涉及的知识点也比较多,今天利用五一假期对AMS的一个方面,Activity的启动模式进行源码分析,这里面包括了ActivityR ...

  2. 【安卓 R 源码】Activity 启动流程及其生命周期源码分析

    1. Activty 的生命周期 activity的生命周期 oncreate()->onstart()->onResume()->onPause()->onStop()-&g ...

  3. android源码学习- APP启动流程(android12源码)

    前言: 百度一搜能找到很多讲APP启动流程的,但是往往要么就是太老旧(还是基于android6去分析的),要么就是不全(往往只讲了整个流程的一小部分).所以我结合网上现有的文章,以及源码的阅读和调试, ...

  4. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

  5. Android进阶——Small源码分析之启动流程详解

    前言 插件化现在已经是Android工程师必备的技能之一,只是学会怎么使用是不行的,所以蹭有时间研究一下Small的源码.对于插件化主要解决的问题是四大组件的加载和资源的加载,读懂所有Small源码需 ...

  6. Kubelet源码分析(一):启动流程分析

    源码版本 kubernetes version: v1.3.0 简介 在Kubernetes急群众,在每个Node节点上都会启动一个kubelet服务进程.该进程用于处理Master节点下发到本节点的 ...

  7. Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程

    基于QuickStart中的一个demo来分析 from flask import Flaskapp = Flask(__name__)@app.route("/") def he ...

  8. 以太坊Go-ethereum源码分析之启动流程

    以太坊源码编译需要gov1.7以上,及C编译器,执行make geth 即可编译项目,编译后可执行的geth文件. Makefile文件: geth:build/env.sh go run build ...

  9. Android源码分析-全面理解Context

    前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...

  10. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. OpenStack环境搭建(一:Virtual Box 5.1 环境的安装及配置)
  2. 6.set ff=unix;设置Linux中文件中每行后又尖括号的情况
  3. sublime开发python需要安装哪些插件_Sublime text 3搭建Python开发环境及常用插件安装...
  4. 乱花渐欲迷人眼-杜绝设计的视噪
  5. C#将Json字符串反序列化成List对象类集合
  6. sql视图能使用触发器吗_白刚玉粉末能重复使用吗
  7. 父母该不该把自己的收入告诉孩子?
  8. 2022年最新《谷粒学院开发教程》:2 - 前后端交互篇
  9. 【揭秘】中国四大银行的大数据应用已到了哪个阶段?
  10. Microsemi Libero SoC/IDE/SoftConsole/FlashPro安装包所有版本下载链接
  11. C# 实现国密SM4加解密封装
  12. 甘肃省学业水平测试计算机,甘肃省信息技术学业水平测试试卷
  13. 报告显示,宝爸参与度不断提升,超三成男性提前服用营养品备孕
  14. 遇到电脑任务栏卡死怎么办
  15. Elasticsearch许可证过期导致ES用不了的问题
  16. 服务器向阿里云转移之容器化1.0.1容器建立
  17. idea新建maven工程没有artifacts
  18. DC电源口实物VCC引脚和GND引脚
  19. 工作流之待办事宜消息提醒篇
  20. 扫描仪CCC认证注意事项及标准依据

热门文章

  1. 火狐浏览器_全球知名度非常高的火狐浏览器,它好在哪呢?
  2. 亿能bms上位机_BMS上位机 - 源码下载|Windows编程|通讯编程|源代码 - 源码中国
  3. node + node-webkit实现电脑文件信息扫描小插件
  4. manage key mysql_mysql相关操作
  5. Layui 数据表格动态cols(字段)动态变化
  6. curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  7. GDK获得各种scale factor
  8. JS不能向WASM传递数组?
  9. 泰山OFFICE正式在UOS应用商店上架
  10. LINUX下载编译libks