代码基于 Android 11
ActivityTaskManagerService # initialize
public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,Looper looper) {mActivityStartController = new ActivityStartController(this);}
ActivityStartController
创建 DefaultFactory 工厂类
ActivityStartController(ActivityTaskManagerService service) {this(service, service.mStackSupervisor,new DefaultFactory(service, service.mStackSupervisor,new ActivityStartInterceptor(service, service.mStackSupervisor)));}@VisibleForTestingActivityStartController(ActivityTaskManagerService service, ActivityStackSupervisor supervisor,Factory factory) {mService = service;mSupervisor = supervisor;mHandler = new StartHandler(mService.mH.getLooper());mFactory = factory;mFactory.setController(this);mPendingRemoteAnimationRegistry = new PendingRemoteAnimationRegistry(service.mGlobalLock,service.mH);}
DefaultFactory 创建
DefaultFactory 用来生产 ActivityStarter
传递 ActivityStartInterceptor 拦截器给DefaultFactory
DefaultFactory(ActivityTaskManagerService service,ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {mService = service;mSupervisor = supervisor;mInterceptor = interceptor;}
创建ActivityStarter
传递 ActivityStartInterceptor 拦截器给ActivityStarter
public ActivityStarter obtain() {ActivityStarter starter = mStarterPool.acquire();if (starter == null) {starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);}return starter;}
构造 ActivityStarter
ActivityStarter 获取拦截器:ActivityStartInterceptor
ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service,ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {mController = controller;mService = service;mRootWindowContainer = service.mRootWindowContainer;mSupervisor = supervisor;mInterceptor = interceptor;reset(true);}
ActivityStartInterceptor 拦截器的使用
int executeRequest(Request request) {mInterceptor.setStates(userId, realCallingPid, realCallingUid, startFlags, callingPackage,callingFeatureId);if (mInterceptor.intercept(intent, rInfo, aInfo, resolvedType, inTask, callingPid,callingUid, checkedOptions)) {// activity start was intercepted, e.g. because the target user is currently in quiet// mode (turn off work) or the target application is suspendedintent = mInterceptor.mIntent;rInfo = mInterceptor.mRInfo;aInfo = mInterceptor.mAInfo;resolvedType = mInterceptor.mResolvedType;inTask = mInterceptor.mInTask;callingPid = mInterceptor.mCallingPid;callingUid = mInterceptor.mCallingUid;checkedOptions = mInterceptor.mActivityOptions;// The interception target shouldn't get any permission grants// intended for the original destinationintentGrants = null;}
}