Activity启动分为两种情况
针对于这两种情况,我们都可以对此用一套流程来描述,针对冷启动情况,其中会添加一部分创建ActivityThread的流程
还是先上图,图片出处GitYuan
假设在图片流程之前,我们做的是点击桌面按钮操作,那么会去执行activity的startActivity操作,该方法里面会通过Instrumetation这个大管家去调用其他方法
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());
}
...
}
在这个方法里面才是真正地通过AMS操作activity,注意,此时的Context,ContextThread,Token都是发起方Activity的,不是被调起方的。其中的ContextThread为发起方所在的ActivityThread中的ApplicationThread属性,该属性为Binder类型,用来和AMS进行交互
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
}
下面会通过ActivityStack类中的封装,执行startActivityMayWait()
int ret = mActivityStarter.startActivityMayWait(null, targetUid, targetPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, null,
null, null, bOptions, ignoreTargetSecurity, userId, null, null);
在ActivityStarter.java的startActivityMaywait()方法中,再调用startActivityLocked()方法,进一步调用startActivityUnchecked()。用图表示如下
接着上图,AMS后面会将Activity的处理放到ActivityStackSupervisor类中。其中值得注意的几个地方如下:
如果不存在该进程
1. AMS.startProcessLocked()
2. zygote fork new process;Process.start()
3. ActivityThread.main()
4. Looper.prepareMain()/ActivityThread.atttach(false),Loop.loop()
5. AMS.attachApplication(IAppicationThread)建立起ActivityThread和AMS之间的联系,在AMS.attachApplication()方法中,会调用thread.bindApplication(进程相关属性),调用完后通过Handler传递给ActivityThread执行handleBindApplication操作。AMS.attachApplication()中还有一件重要的事情就是最终调用realStartActivity()。具体过程为:
//AMS中的attachApplication()方法
void attachApplication(){
...
thread.bindApplication(...);
...
mStackSupervisor.attachApplicationLocked();//最终调用realStartActivity()
}
-----2020新增----
后来, Android引入了 JetPacket框架后,新增了 Life Cycle念,可以让应用通过 addobserver的方式方便地监听到 activity /fragment的生命
周期。同时在启动 acitivity的地方做出了一些修改,目的是为了让activity的生命周期操作从原来的 ActivityThread中到剥离出来,使用新的类来管理生命周期,如 LaunchActivityltem/ResumeActivityltem/ PauseAcitivtyltem等。这些类都在 android/app/transilatonserve径下。原来的 acitivty启动流程走到 ActivityStackSuperVisor走到 realStartActivity后,里面调用了ATMS.gstlifecyclemanager.scheduleTransaction(clinet) 方法,其中,client有上述item信息。这样便开始了生命周期行为。 LaunchActivityltem中持有 Application Thread,可以方便地和app测进行交互
从ActivityThread.mH中的代码来看,之前的activity生命周期相关的launch message处理交给了EXECUTE_TRANSACTION处理。
这些XActivityItem都继承自ActivityLifecycleItem extends ClientTransactionItem
上面说的用来管理这些单独ActivityLifeCycleItem的类如下: