在本篇以及后面的文章中,可能会出现一些和之前博客相同的代码片段,如果出现的话,我只说下该代码的作用,然后指出第一次出现该代码片段的博客,大家有兴趣的话可以去之前的博客看下,比如ActivityManager.getService()获取的是ActivityManagerService的对象,我在 Android Activity启动(一) Application创建的过程以及原理分析 博客中提到过,就不会对它再多做解释了。
下面开始:
Activity的跳转都是通过startActivity(),先上代码(我用的android的版本是26)
@Override
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
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);
}
可以看到,startActivity方法调用的时候,最终也是调用了startActivityForResult()方法
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);
......
} else {
......
}
}
省略了部分不重要的代码,可以看到在startActivityForResult()方法中调用了Instrumentation对象的execStartActivity()方法来启动一个Activity,在该方法的参数里面有一个mMainThread.getApplicationThread(),获取的其实是ActivityThread中ApplicationThread的对象,充当了Binder的作用,用于ActivityManagerService和app进行通信,对于Instrumentation对象到底起了什么作用,上篇博客也简单提了一下,其实相当于是一个管家,涉及到Activity很多生命周期的操作都会通过Instrumentation。
下面我们来看下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);
//调用ActivityManagerServices的startActiity()方法
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;
}
在execStartActivity()方法中,通过ActivityManager.getService()获取ActivityManagerService的对象,调用它的startActivity()方法
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
enforceNotIsolatedCaller("startActivity");
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "startActivity", null);
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
profilerInfo, null, null, bOptions, false, userId, null, null,
"startActivityAsUser");
}
调用了ActivityStarter的startActivityMyWait()方法,ActivityStarter可用来处理Activity的Intent和Flags等属性。我们来看下它的startActivityMyWait()方法
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 inTask, String reason) {
.....
//解释Intent,获得ResolveInfo信息
ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId);
//获取目标Intent对应的Activity信息
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
......
synchronized (mService) {
......
//调用startActivityLocked()方法
int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType,
aInfo, rInfo, voiceSession, voiceInteractor,
resultTo, resultWho, requestCode, callingPid,
callingUid, callingPackage, realCallingPid, realCallingUid,
startFlags,options, ignoreTargetSecurity, componentSpecified,
outRecord, container,inTask, reason);
.....
return res;
}
}
在上述方法中,大致会先通过mSupervisor对象解析一些信息,然后再调用startActivityLocked()方法,其中mSupervisor是ActivityStackSupervisor类的对象,ActivityStackSupervisor很明显是Activity栈的管理类,下面我来看下startActivityLocked()方法
int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
TaskRecord inTask, String reason) {
......
mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,
aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,