当前位置: 首页 > news >正文

Android源码之App启动

        

目录

App启动概述

App启动过程

App启动过程图

源码概述

跨进程启动

进程内启动


下面以应用桌面Launcher启动App的MainActivity来举例:

App启动概述

        首先,MainActivity是由Launcher组件来启动的,而Launcher又是通过Activity管理服务ActivityManagerService(AMS)来启动MainActivity组件的。由于MainActivity组件和Launcher组件,以及AMS是三个不同的进程, 所以这三个不同的进程只能通过 Binder进程间通信机制来完成MainActivity组件的启动过程。

App启动过程

  1. Launcher组件向AMS发送一个启动MainActivity组件进程间通信请求。
  2. AMS首先要将启动MainActivity的信息保存起来,然后向Launcher发送一个中止状态的进程间通信请求。
  3. Launcher组件进入到中止状态以后,会向AMS发送一个已经进入了中止状态的进程间通信请求,以便 AMS可以继续执行启动 MainActivity组件的操作。
  4. AMS如果发现启动MainActivity进程不存在,就会创建一个新的应用程序进程。
  5. 新的应用程序进程启动后,就会向AMS发送一个启动完成的进程间通信请求,以便 AMS可以继续执行启动MainActivity组件的操作。
  6. AMS将第二步保存下来的MainActivity的信息发送到第四步启动创建的应用程序进程,以便它可以将MainActivity组件启动起来。

App启动过程图

源码概述

跨进程启动

  1. 当前进程请求AMS:当前进程采用Binder IPC向system_server进程(AMS)发起startActivity请求;
  2. AMS发送创建应用进程请求:system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. Zygote进程接受请求并fork应用进程,即App进程;
  4. App进程通过Binder向AMS发起attachApplication请求,AMS绑定ApplicationThread;
  5. AMS发送启动Activity请求:system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
  6. ActivityThread的Handler处理启动Activity请求:App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程(ActivityThread)发送LAUNCH_ACTIVITY消息;
  7. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate、onResume等方法,UI渲染结束后便可以看到App主界面。

进程内启动

  1. 当前进程请求AMS;
  2. AMS发送启动Activity请求:system_server进程接收到请求后,解析Activity信息、处理启动参数,并给当前进程发送 scheduleLaunchActivity请求;
  3. ActivityThread的Handler处理启动Activity请求:App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程(ActivityThread)发送LAUNCH_ACTIVITY消息;
  4. 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate、onResume等方法,UI渲染结束后便可以看到App主界面。

http://www.dtcms.com/a/95624.html

相关文章:

  • Java函数式编程
  • Java基础——面向对象
  • 如何在Vue项目中封装axios
  • 人工智能生成的图片,受著作权法保护吗?
  • Apache SeaTunnel 用户征稿计划启动!分享数据集成实践经验,赢社区荣誉!
  • verilog/systemverilog中的位序问题
  • 【3天!!!从0-1完成自动化集成平台开发--Cursor AI赋能0代码基础测试工程师开发平台-亲测有效-保姆级】
  • Python 装饰模式
  • springboot 实现base64格式wav转码并保存
  • DeepSeek 给 API 网关上了一波热度
  • 0.雷达信号
  • 常用设计模式
  • 宝塔SSL申请Let‘s Encrypt提示“验证信息构造失败!{}“
  • 网损仪详解
  • 深度学习笔记19-YOLOv5-C3模块实现(Pytorch)
  • win10下python脚本运行缺失ccache的问题处理
  • 性能测试~
  • 线程同步——读写锁
  • MYTOOL-记事本
  • C#基础学习(八)终章 C#中的结构体
  • Mockito 全面指南:从单元测试基础到高级模拟技术
  • 前端知识点---window.location.assign() 和 window.location.href 的区别(javascript)
  • deepseek 技术的前生今世:从开源先锋到AGI探索者
  • ETL中数据转换的三种处理方式
  • 蓝耘平台API深度剖析:如何高效实现AI应用联动
  • 周报参考模板
  • IPv6 Dhcpv6 DUID
  • 指标管理+数仓引擎:衡石ChatBI端到端平台的技术架构深度解析
  • 谷歌Android闭源与鸿蒙崛起:一场关于技术主权的生态博弈
  • 第二章VRP介绍///Telnet///DHCP