Android应用启动流程

仅供自己学习记录使用

目录

一、AMS简介

1.AMS功能概述

2.ActivityStack

3.ActivityTask

4.其他MS

二、应用启动流程

1.启动方式

2.startActivity流程

3.Zygote启动应用

4.ActivityThread


一、AMS简介

1.AMS功能概述

        和其他系统服务一样,AMS寄存于systemService中,它在系统启动时,以线程的形式呈现在我们面前,不断处理客户的请求。在创建时,AMS主要做了两件事:1).创建自己;2).注册其他服务,如"meminfo","cpuinfo"等。

AMS启动后主要提供的功能在IActivityManager.java中有所描述,分类如下:

  • 组件状态管理:管理四大组件,包括四大组件的一系列生命活动。
  • 组件状态查询:用于查询组件的运行状态。
  • Task相关
  • 其他事务

2.ActivityStack

ActivityManagerService.java(AMS的实例对象)中其类的成员变量mMianStack就是ActivityStack的对象。它在系统中与其他对象的关系:每一个ActivityRecord都会有一个Activity与之对应,一个Activity可能会有多个ActivityRecord,因为Activity可以被多次实例化,取决于其launchmode。一系列相关的ActivityRecord组成了一个TaskRecord,TaskRecord是存在于ActivityStack中,ActivityStackSupervisor是用来管理这些ActivityStack的。下面是一个简单的关系图


可以看到一个ActivityStack可以包含很多个TaskRecord,一个TaskRecord又可以包含很多个ActivityRecord。

ActivityRecord包含了一个Activity的所有信息,ActivityRecord是在startActivity时创建的。

在startActivity时,也会创建TaskRecord,当没有可复用的TaskRecord时(假如第一次跑进来,肯定是没有的,必须要创建),就会创建一个TaskRecord,mStartActivity是要启动的Activity

ActivityRecord,通过其setTask就把ActivityRecord绑定到了一个TaskRecord上 。ActivityStack并不是开机就创建的,而是在需要时才创建。

3.ActivityTask

ActivityTask可以看做完成同一任务的集合,这个任务是用户处理某一事件相继所用到组件,其管理一系列的活动。

4.其他MS

二、应用启动流程

总体流程:启动->startActivity系列->Zygote进程->ActivityThread主线程:mian()函数,开启消息循环→onCreate(),10s或者其他时间内完成,不然启动错误。

1.启动方式

  1. 在Launcher中点击相应的应用程序图标启动:大多由用户点击桌面的图标发起。
  2. 通过startActivity启动:这种方式通过位于源码内部启动应用程序。

不管怎样,最终都会调用到AMS的startActivity函数系列来启动Activity,在启动它之前,需要做一些列繁琐的判断和准备工作-由startActivity函数系列来完成,最后是通过socket来通知Zygote进程来启动应用,之后是执行Activity的主线程。具体分析如下:

2.startActivity流程

startActivity@ActivityManagerService.java

startActivityAsUser@ActivityManagerService.java

startActivityMayWait@ActivityStack.java

startActivityLocked@ActivityStack.java //后面的Locked代表线程安全

startActivityUncheckedLocked@ActivityStack.java

这些函数完成了应用启动的一些列过程,包括权限检查,Intent匹配,设置ActivityStack变量各值,在WMS中注册,根据FLAG标志启动活动,最后通知Zygote来复制进程。

3.Zygote启动应用

  1. AMS通过socket向zygote发送创建应用程序进程请求;
  2. zygote接收请求并创建应用程序进程
  3. 应用进程创建后会启动Binder线程池以及开启消息循环机制。

       时序图如下:

4.ActivityThread

ActivityThread主线程:mian()函数,开启消息循环→onCreate(),10s或者其他时间内完成,不然启动错误。

ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法,这样便完成了Activity的启动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值