当前位置: 首页 > 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主界面。

相关文章:

  • 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#中的结构体
  • 官方网站的英文/百度竞价托管哪家好
  • 上海建设网站浦东新区污水管网工程/深圳网络营销推广招聘网
  • ps网页设计作品欣赏/seo搜索引擎优化工资多少钱
  • 无锡制作网站公司/同城推广引流平台
  • 北京免费发布企业信息网站/广告推广软文案例
  • 网站开发检测用户微信号/推广app有哪些