相关类
Activity 管理UI
ActivityThread:进程入口,管理进程的相关事件处理。主线程入口。
包括许多内部类,其中H类是Handler类,控制了所有的应用程序事件:

LoadedApk : packageInfo
ApplicationThread:这是ActivityThread的内部类,它继承了binder.是ActivityThread与AMS通信的桥梁。

这里可以可以看到APP启动的大致流程,下面我们会对这个流程中的单个流程大致分析。

上图中主要是对启动流程图的第一步再细化
1-2从Launcher到Activity的方法调用都没什么好说的。最后传到Activity里面调用startAxtivityForResult()就是传入了一个intent。
3中startAxtivityForResult()里面主要做了两步,一步是4-5,通过binder调用AMS startActivity(),这里首先是调用Instrumentation.execStarActivitity(),
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
execStartActivity()里面调用ActivityTaskManager.getService()获取到IActivityTaskManager,IActivityTaskManager通过binder然后就请求到AMS
public ActivityResult execStartActivity(
......
try {
intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
另一步6后面再说。到此就完成了launcher到AMS的请求。下面是AMS的server端处理
下图是AMS端的调用流程

executeRequest()这个方法很长,做了很多事,首先看到注释对此方法的描述

这个方法里面主要会对ActivityRecord和Task进行初始化或取用
关于ActivityRecord 和Task相关不再这里详述,参考下图和相关连接
ActivityRecord及相关数据结构,类的关系图:

ActivityRecord、TaskRecord、ActivityStack的相关知识点
https://www.jianshu.com/p/94816e52cd77
https://juejin.cn/post/6856298463119409165
最后
网友评论