Activity启动流程详解
看到上面的标记A:
看到标记C处,这个IApplicationThread是什么呢?这个我在Activity生命周期回调是如何被回调的?有解释过,这里我简单的解释一下:这个IApplicationThread是Android应用程序提供对外(即系统ActivityManagerService)提供服务,外部可以持有这个类的proxy来和我的Android应用程序跨进程通信。
接着看到标记D处:
这里调用了ActivityManager.getService如下:
这里通过ServiceManger获取到了系统服务ActivityManager的代理对象,这个am实际上是一个proxy。
回到标记D的后半截startActivity如下:
上图提到会导致这个onTransact被调用,那么我们首先要找到AM,这个AM在哪里呢,这个AM一定是继承了Stub的,如下:
分析到上图位置,可以看到应用程序要求启动一个新的Activity,然后系统服务ActivityManagerService接收到这个要求,调用它自身的startActivity方法:
看到上图标记G处:
接着看到标记H:
快受不了啦,还在兜兜转转,抓狂呀,坚持下,看到上图的标记 I :
看到上文标记K:
接着跟进上图标记M:
进入N:
进入O:
进入P:
进入Q:
看到上图说的,scheduleLaunchActivity被调用之后,应用程序的真正的这个提供 远程服务对象的这个方法也会被调用,那么在应用程序中这个对象在哪里被复制呢?关于这一点我在Activity生命周期回调是如何被回调的?有提到过,其实是在ActivityThread中赋值的:
这里我在强调一下ApplicationThread的作用:
为什么要有ApplicationThread呢?首先Android应用程序可以通过ActivityManager提供给我们的代理类来向系统ActivityManagerService发送信息比如Android应用程序发送信息给系统服务ActivityManagerService
要求启动一个Activity,换句话说Android应用程序持有ActivityManager的代理对象就可以像系统服务ActivityManagerService发消息,那反过来系统服务ActivityManager要向应用程序发送消息应该怎么办?一样的道理系统服务只要持有Android应用程序提供的一个代理对象不就可以了吗?所以这个ApplicationThread对象的意义就在于此。
继续:
看到V1:
上图分析完之后,Activity的onCreate onstart也调用完了,来到V2:
接着看到W1:
再回到W2
到此Activity的整个启动流程都分析完了,回顾上文分析,Activity的启动流程还是比较复杂的,总结来讲应该重点把握整个流程中,里程碑式的几个事件:
- Binde机制,Stub代表什么,proxy代表什么
- ApplicationThread的作用以及在哪里被赋值的
- H是什么
- ViewRootImpl 以及 DecorView,View绘制流程
如果你熟悉AIDL的话,你会知道生成的代码的Stub表示的对外提供的远程服务,Proxy则表示这个远程服务对象的代理。
ApplicationThread是android应用程序对外或者说对系统服务ActivityManagerService提供的远程服务,系统服务ActivityManagerService要想控制我的Android应用程序可以通过这个对象的代理对象,反过来android应用程序也是通过ActivityManager的代理对象来向系统服务传递消息的,所以以上复杂兜兜转转的启动流程可以通过以下一张图来极简的描述:
H是一个Handler类型,先后会创建一个Activity对象,并关联上Context,Window,然后回调oncreat、onstart、之后再来到onResume,onResume这一步要做的东西比较多,这个时候onCreat已经被调用了,所以SetContentView也创建好了,onReSume这一步则是要把这些View绘制出来,首先创建了ViewRootImpl ,然后调用viewRootImpl的setView方法将DecorView设置进ViewRootImpl,这个方法之后View的绘制流程就即将开启了。
总结
Activity启动流程是面试中常问的问题,我认为在回答的时候最好能将我上面提到的几个“里程碑事件”有机的组合在一起描述 回到,反而那些函数跳来跳去的兜兜转转并不重要,也不太可能记得住,记住核心的东西本质的东西才最重要。
Activity启动流程详解相关推荐
- U-Boot启动流程详解
参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...
- Android系统(187)---最易懂的Activity启动模式详解
Android基础:最易懂的Activity启动模式详解 前言 Android基础中,Activity的启动模式非常重要 本文将全面介绍 Activity的启动模式 目录 目录 1. 定义 即Acti ...
- 【Autosar 启动流程详解】
Autosar 启动流程详解 1. vLinkGen_Template.lsl 2. BrsHwStartup.c 3.BrsMainStartup.c 4.BrsMain.c 链接文件: 1. vL ...
- 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- golang程序启动流程详解
golang程序启动流程详解 环境 go1.16.5 linux/amd64 用例 package mainimport "fmt"func main() {fmt.Println ...
- android zygote启动流程,Android zygote启动流程详解
对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...
- 【线上沙龙直播报名】App 启动流程详解及其优化
点击上方"公众号"可以订阅哦 [美团点评技术沙龙Online]是美团点评技术团队推出的线上分享课程,每月2-3期,采用目前最火热的线上直播形式,邀请美团点评技术专家,面向互联网技术 ...
- Android App启动流程详解
前言:在之前的文章中已经写了apk的打包流程.安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程.经过今天的梳理以后咱们就可以对apk包是怎么编译生成的.apk是怎么被安装到安卓手机的 ...
- Springboot启动流程详解
SpringMVC请求流程详解 SpringMVC框架是一个基于请求驱动的Web框架,并且使用了'前端控制器'模型来进行设计,再根据'请求映射规则'分发给相应的页面控制器进行处理. (一)整体流程 每 ...
最新文章
- ARP欺骗原理与模拟
- java hive 查询语句,使用java连接hive,并执行hive语句详解
- Log4j文件配置教程大全
- 麦块未发现java怎么解决_教大家麦块我的世界盒子如何打开游戏
- 学英语---(2)脱口而出100句经典英语口语
- 详细记录一次npm i canvas报错的解决过程
- java 文件流的帮助类
- 百度和知乎哪个引流效果好?知乎和百度的有什么区别?
- catia 快捷键 激活零件_CATIA快捷键大全
- 《哔哩哔哩助手》助你快速成为B站老司机
- Python实现截图AI文字识字小工具
- matlab如何模拟数字舵机,模拟舵机和数字舵机区别
- 微信引流黑科技:手机浏览器直接唤起微信方案调研
- java8使用Comparator.comparing进行排序
- Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo
- Redis 实现搜索关键词自动补全
- 使用阿里云服务器搭建代理服务器
- 【手把手教你51单片机】三极管在数字电路中的应用
- 信息技术相关的期刊杂志介绍
- FTP下载 550 Failed to open file
热门文章
- java 反射 修改字段_Java反射机制-修改字段值
- 13、GridView案例
- C++知识点45——类继承中的类型转换与访问权限控制(上)
- CUD学习-查看电脑block数量与如何分配给程序
- Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
- P4491 [HAOI2018]染色
- Java架构-面试前必须知道的MySQL命令【explain】
- 20180625笔记
- android 多用户管理UserManager
- linux 下 php 安装 Gearman