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);</