概述
Activity是一种展示型组件,具有两种启动方式,一种是显示的,通过intent实现;另一种是隐式的,也需要intent,但还需要在AndroidManifest.xml
中添加intentfilter。在实现Activity时,需要继承Activity抽象类,并且重写onCreat()方法,因此,Activity具有启动和停止的概念。
流程分析
流程图
Activity的启动
从startActivity开始,代码会运行到Activity的startActivityForResult方法。
1 | Activity.java |
mParent代表的是ActivityGroup,ActivityGroup最开始被用来在一个界面中嵌入多个子Activity,但是其在API 13中已经被废弃了,
系统推荐采用Fragment来代替ActivityGroup。
mMainThread.getApplicationThread()这个参数,它的类型是ApplicationThread,ApplicationThread是ActivityThread的内部类,
继承IApplicationThread.Stub,也是个Binder对象。
接下来看看execStartActivity方法
1 | Instrumentation.java |
这里使用了ActivityTaskManager来启动Activity。ActivityTaskManager是一个Binder。ActivityTaskManager.getService()会返回Activity
服务管理器ActivityManagerService(Android10返回ActivityTaskManagerService)。
ATMS是在Android10中新增的,分担了之前ActivityManagerService(AMS)的一部分功能(activity task相关)。
在Android10 之前 ,这个地方获取的是服务是AMS。查看Android10的AMS,你会发现startActivity方法内也是调用了ATMS的startActivity方法。
所以在理解上,ATMS就隶属于AMS。
接下来要去ActivityTaskManagerService看看了
Activity的管理
1 | ActivityTaskManagerService.java |
getActivityStartController().obtainStarter方法获取ActivityStarter实例,进去看看execute。
1 | ActivityStarter.java |
startActivityMayWait最终也是会进入startActivity,startActivity调用了startActivityUnchecked,startActivityUnchecked调用了mRootActivityContainer.resumeFocusedStacksTopActivities(mTargetStack, mStartActivity, mOptions);
。mRootActivityContainer
是RootActivityContainer,Android10新增到API,分担了ActivityStackSupervisor部分功能。接着看看RootActivityContainer
1 | RootActivityContainer.java |
接着跳转到了ActivityStack的resumeTopActivityUncheckedLocked方法
1 | ActivityStack.java |
接下来到了ActivityStackSupervisor的startSpecificActivityLocked方法
1 | ActivityStackSupervisor.java |
由以上代码可知,ClientTransaction包含一系列的待客户端处理的事务的容器,客户端接收后取出事务并执行。其添加了LaunchActivityItem、ResumeActivityItem等。
然后运行ClientLifecycleManager的scheduleTransaction
1 | ClientLifecycleManager.java |
1 | ClientTransaction.java |
IApplicationThread是ApplicationThread在系统进程的代理,所以真正执行的地方是客户端的ApplicationThread。
现有流程如下:
启动Activity的操作从客户端跨进程转移到ATMS,ATMS通过ActivityStarter、ActivityStack、ActivityStackSupervisor对Activity任务、
Activity栈、Activity记录管理后,又用过跨进程把正在启动过程又转移到了客户端。
流程图如下:
线程切换及消息处理
接下来看看ApplicationThread的scheduleTransaction
scheduleTransaction会发送Message,ActivityThread内部类H处理此消息
1 | //ApplicationThread.java |
最终到了TransactionExecutor的execute方法
1 | //TransactionExecutor.java |
继续查看LaunchActivityItem的execute
1 | LaunchActivityItem.java |
里面调用了client.handleLaunchActivity方法,client是ClientTransactionHandler的实例,是在TransactionExecutor构造方法传入的,
TransactionExecutor创建是在ActivityThread中,所以,client.handleLaunchActivity方法就是ActivityThread的handleLaunchActivity方法。
流程图如下:
Activity初始化及生命周期函数回调
1 | ActivityThread.java |
由以上代码可知,performLaunchActivity主要完成以下事情:
- 从ActivityClientRecord获取待启动的Activity的组件信息
- 通过mInstrumentation.newActivity方法使用类加载器创建activity实例
- 通过LoadedApk的makeApplication方法创建Application对象,内部也是通过mInstrumentation使用类加载器,创建后就调用了instrumentation.callApplicationOnCreate方法,也就是Application的onCreate方法。
- 创建ContextImpl对象并通过activity.attach方法对重要数据初始化,关联了Context的具体实现ContextImpl,attach方法内部还完成了window创建,这样Window接收到外部事件后就能传递给Activity了。
- 调用Activity的onCreate方法,是通过 mInstrumentation.callActivityOnCreate方法完成。
其他生命周期处理也是类似的,先在ActivityStackSupervisor中添加对应的XXXActivityItem,然后在ActivityThread中的handleXXXActivity处理。
总结归纳
整体流程图如下:
一些类的介绍:
类名 | 作用 |
---|---|
ActivityThread | 应用的入口类,系统通过调用main函数,开启消息循环队列。ActivityThread所在线程被称为应用的主线程(UI线程) |
ApplicationThread | 是ActivityThread的内部类,继承IApplicationThread.Stub,是一个IBinder,是ActiivtyThread和AMS通信的桥梁,AMS则通过代理调用此App进程的本地方法,运行在Binder线程池 |
H | 继承Handler,在ActivityThread中初始化,即主线程Handler,用于主线程所有消息的处理。本片中主要用于把消息从Binder线程池切换到主线程 |
Intrumentation | 具有跟踪application及activity生命周期的功能,用于监控app和系统的交互 |
ActivityManagerService | Android中最核心的服务之一,负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要,它本身也是一个Binder的实现类。 |
ActivityTaskManagerService | 管理activity及其容器(task, stacks, displays)的系统服务(Android10中新增,分担了AMS的部分职责) |
ActivityStarter | 用于解释如何启动活动。该类收集所有逻辑,用于确定Intent和flag应如何转换为活动以及相关的任务和堆栈 |
ActivityStack | 用来管理系统所有的Activity,内部维护了Activity的所有状态和Activity相关的列表等数据 |
ActivityStackSupervisor | 负责所有Activity栈的管理。AMS的stack管理主要有三个类,ActivityStackSupervisor,ActivityStack和TaskRecord |
ClientLifecycleManager | 客户端生命周期执行请求管理 |
ClientTransaction | 是包含一系列的 待客户端处理的事务 的容器,客户端接收后取出事务并执行 |
LaunchActivityItem、ResumeActivityItem | 继承ClientTransactionItem,客户端要执行的事务信息,启动activity |
参考
- https://juejin.cn/post/6847902222294990862
- 《Android开发艺术探索》