上篇文章讲述了app从启动创建Activity调用onCreate,onStart, onResume方法,这篇文章讲述一下Activity启动的另一个切入点:startActivity方法,启动Activity。
Android进阶3:Activity源码分析(1) —— Activity启动流程(8.0)
通过上一篇文章,我们总结一下:
1:ActivityThread是通过Instrumentation调度Activity的生命周期的
2:ApplicationThread继承自IApplicationThread.Stub,本身就是一个Binder对象。AMS给ActivityThread传递信息,就是通过Binder机制,也就是ApplicationThread传递的。
3:Instrumentation内部提供了创建Activity,调用Activity的方法,创建Application,调用Application的方法,至少从我们上一篇文章得到的结论是:Instrumentation好比一个管家,管理着Activity和Application的生命周期。
接下来是一些小知识点:
1:我们之前说的UI主线程初始化Looper是在ActivityThread中的main方法中,这就是为什么我们可以在UI层直接发送使用Handler机制。
2:项目开发中总是在Application的onCreate中,做一些初始化操作,因为Application的创建的比Activity创建更早,并且Application 的onCreate方法调用的更早。
好了,开始分析另一个切入点:Activity的startActivity(…)
Activity启动:startActivity()
先看下Activity的startActivity源码:
@Override
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
//Bundle : 传递的数据
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
//不需要返回数据,requestCode默认:-1
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
startActivityForResult(intent, -1);
}
}
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
//requestCode = -1
options = transferSpringboardActivityOptions(options);
//调用Instrumentation的execStartActivity方法;
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
......
}
通过上述代码可以看到:startActivity其实最终调用的都是startActivityForResult,如果不需要返回值,requestCode传递-1, 此时调用Instrumentation的execStartActivity方法。
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
.....
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
/*
ActivityManager.getService().startActivity()就是IActivityManager的代理对象调用了startActivity方法,通过binder机制,
从而调用ActivityManagerService的startActivity方法。
*/
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), 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;
}
再调用AMS的startActivity方法,Binder机制
@Override
public int startActivity(IBinder whoThread, String callingPackage,
Intent intent, String resolvedType, Bundle bOptions) {
.......
return mActivityStarter.startActivityMayWait(appThread, -1, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null,
null, bOptions, false, callingUser, null, tr, "AppTaskImpl");
}
进入:startActivityMayWait
final int startActivityMayWait(IApplicationThread caller, int callingUid,
String callingPackage, Intent intent, String resolvedType,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, WaitResult outResult,
Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
IActivityContainer iContainer, TaskRecord i