自由笔记-Activity之启动流程分析

Activity框架和管理结构

Activity管理的核心是AcitivityManagerService,是一个独立的进程;

ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理;

ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制,通过ApplicationThread这个桥梁进行通信

ApplicationThread是ActivityThread的一个内部类

一个应用程序中所有Activity只有一个ActivityThread属于一个Process

 

ActiveThread重要成员介绍:

final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();//activity记录类

final ApplicationThread mAppThread = new ApplicationThread();用来与AMS交互通信的桥梁,是一个binder.

final H mH = new H();消息循环handler。

Instrumentation mInstrumentation;用于监控程序和系统之间的交互操作

 

 

ActivityManagerService:Activity管理服务类,通过mHistory栈来管理所有的activity,应用启动activity之后,发动启动请求到AMS,AMS会根据

activity、ProcessRecord等信息创建HistoryRecord实例r并加入到mHistory当中。activity被加入到mHistory之后,只是说明在服务端可以找到该

activity记录了,但是在客户端目前还没有该activity记录。还需要通过ProcessRecord中的thread(IApplication)变量,调用它的

scheduleLaunchActivity方法在ActivityThread中创建新的ActivityRecord记录(之前我们说过,客户端的activity是用ActivityRecord

记录的,并放在mActivities中)

app.thread.scheduleLaunchActivity(new Intent(r.intent), r,System.identityHashCode(r),

 

ActivityRecord:activity记录类,代表一个Activity。

 

TaskRecord:任务栈记录类,代表一个存放activity的任务栈

 

ActivityStarter:activity启动前逻辑处理类,主要收集所有的逻辑来确定意图(intent)和标志(flag),然后转变为对应的活动(activity)和关联的任务和堆栈

 

ActivityStack:activtiy任务栈管理类,维护着一个private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();负责管理各个activity的任务栈

 

ActivityStackSupervisor:任务栈超级管理员,其实算ActivityStack的辅助管理类,它和ActivityStack相互持有

 

系统启动的时候,会创建一个PackageManagerService,PackageManagerService会对应用程序的配置文件AndroidManifest.xml进行解析,从而得到程序里的组件信息。

PackageManagerService去查询所有action为“android.intent.action.MAIN”并且category为“android.intent.category.LAUNCHER”的Activity,然后为每个

应用程序创建一个快捷方式图标,并把程序信息与之关联,作为启动的第一个Activity。

 

我将activty启动分为以下几步:

1、客户端发出启动activity命令;

2、AMS接受到命令,启动Activity相关工作

3、AMS查询当前需要启动activity的任务栈是否有需要执行onPasue的activity,如果有执行,如果没有启动activity

4、如果有需要执行onPause的activity,那么回调客户端调用该方法

5、该方法调用完成后,通知AMS启动需要启动的activity

6、需要启动的activity准备信息完成后,判断该activity所属进程是否已经启动,如果启动,直接启动activity,如果没有,先启动进程,进入到该进程的activityThread的main方法

7、AMS启动activity,通知客户端,调用app.thread.scheduleLaunchActivity

8、客户端执行scheduleLaunchActivity,进行activity的一系列启动动作:生命周期方法执行、设置视图、通知WMS绘制视图

9、activity成功启动后,通知AMS让需要执行onStop方法的activity执行该方法

 

其中1-7步主要在AMS部分执行

第8步在客户端执行

第9步在AMS执行

 

AMS部分:

 

1、不管是从lancher启动还是应用内启动,最原始的起点,都是activity内部的startActivity方法

 

@Override

public void startActivity(Intent intent, @Nullable Bundle options) {

if (options != null) {

startActivityForResult(intent, -1, options);</

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值