ActivityManagerService:startActivityAsUser()-->ActivityStarter:execute()
在startActivityAsUser()方法中,先获取ActivityStarter实例,然后通过一系列的setXX()方法,对其中的mRequest对象的多个参数进行赋值,最后执行ActivityStarter的execute()方法。
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,
boolean validateIncomingUser) {
......
//获取ActivityStarter实例,执行execute方法
return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)//通过一系列setXX方法传递参数给ActivityStarter的mRequest对象
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId)
.execute();//最后执行ActivityStarter的execute()
}
这里关于ActivityStarter对象的获取,稍微展开一下,总的来说是通过工厂模式+对象池的复用
mActivityStartController.obtainStarter()调用工厂来获取ActivityStarter对象
ActivityStarter obtainStarter(Intent intent, String reason) {
//ActivityStarter:DefaultFactory静态内部类对象
return mFactory.obtain().setIntent(intent).setReason(reason);
}
这里的mFactoty对象是ActivityStarter的静态内部类DefaultFacory的实例,这个类定义了ActivityStarter的最大实例数和复用的对象池。
static class DefaultFactory implements Factory {
private final int MAX_STARTER_COUNT = 3;
......
private SynchronizedPool mStarterPool =
new SynchronizedPool<>(MAX_STARTER_COUNT);
......
@Override
public ActivityStarter obtain() {
ActivityStarter starter = mStarterPool.acquire();
if (starter == null) {
starter = new ActivityStarter(mController, mService, mSupervisor,
mInterceptor);
}
return starter;
}
@Override
public void recycle(ActivityStarter starter) {
//重置mRequest对象
starter.reset(true /* clearRequest*/);
mStarterPool.release(starter);
}
}
这里可以看到,ActivityStarter的实例数最多不超过三个,是从对象池中获取的,并且每个放入池中的ActivityStarter对象都要进行reset重置清空操作。
在获取到ActivityStarter对象之后,再通过一系列的setXX方法,对mRequest的参数进行重新赋值,最后执行ActivityStarter:execute()方法。