Activity从桌面启动的流程

120 阅读4分钟

Activity从桌面启动时序图 .png

  1. LauncherActivity就是桌面Activity,我们点击应用图标,进入我们的MainActivity。 首先执行LauncherActivity的onListItemClick方法,方法如下
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = intentForPosition(position);
// 调用 startActivity
startActivity(intent);
}

调用了其父类Activity的startActivity方法

2.查看Activity的startActivity方法

@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);
}
}
\

可以看到最终调用了startActivityForResult方法

@Override
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public void startActivityForResult(
String who, Intent intent, int requestCode, @Nullable Bundle options) {
Uri referrer = onProvideReferrer();
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
options = transferSpringboardActivityOptions(options);
// Instrumentation 执行 execStartActivity 方法
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, who,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, who, requestCode,
ar.getResultCode(), ar.getResultData());
}
cancelInputsAndStartExitTransition(options);
}

看到是由Instrumentation执行execStartActivity方法

3.查看Instrumentation类中的execStartActivity方法

@UnsupportedAppUsage
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String target,
Intent intent, int requestCode, Bundle options) {
// 省略部分代码
try {
intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
// 通过ActivityTaskManagerService的startActivity方法
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token, target,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}

可以看到通过ActivityTaskManagerService的startActivity方法来调用

4.查看ActivityTaskManagerService的startActivity

private int startActivityAsUser(IApplicationThread caller, String callingPackage,
@Nullable String callingFeatureId, Intent intent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
// 省略部分代码
// TODO: Switch to user app stacks here.
// 获取 ActivityStartController 获取 ActivityStarter 执行 execurte 方法
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setUserId(userId)
.execute();

}

ActivityTaskManagerService的startActivity方法经过层层调用会执行startActivityAsUser方法,然后通过ActivityStarter调用execute方法来启动activity

5.查看ActivityStarter的execute方法

int execute() {
//省略代码
// 执行该方法
res = executeRequest(mRequest);
//省略代码
}

在该方法中执行了executeRequest方法

// 执行 startActivityUnchecked 方法
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
restrictedBgActivity, intentGrants);

其中执行startActivityUnchecked方法

最终会调用startActivityInner方法

然后关注该方法中的deliverToCurrentTopIfNeeded方法

// If the activity being launched is the same as the one currently at the top, then
// we need to check if it should only be launched once.
final ActivityStack topStack = mRootWindowContainer.getTopDisplayFocusedStack();
if (topStack != null) {
// 注意这个方法
startResult = deliverToCurrentTopIfNeeded(topStack, intentGrants);
if (startResult != START_SUCCESS) {
return startResult;
}
}

6.在该方法中mRootWindowContainer调用了resumeFocusedStacksTopActivities方法

if (mDoResume) {
// 如果mDoResume为true 表示要显示这个activity,则调用这个方法
mRootWindowContainer.resumeFocusedStacksTopActivities();
}

resumeFocusedStacksTopActivities方法种调用了resumeTopActivityUncheckedLocked方法

if (focusedStack != null) {
// 注意这个方法
result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
} else if (targetStack == null) {
result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
display.getDefaultTaskDisplayArea());
}
  1. focusedStack就是ActivityStack,查看ActivityStack的resumeTopActivityUncheckedLocked方法看到调用resumeTopActivityInnerLocked方法
// 显示当前任务栈中的Top顶部的Activity
result = resumeTopActivityInnerLocked(prev, options);

在该方法中经过层层调用执行了startSpecificActivity方法

// 这里 启动activity
mStackSupervisor.startSpecificActivity(next, true, false);

8.查看ActivityStackSupervisor类中的startSpecificActivity方法

// 真正启动activity
realStartActivityLocked(r, wpc, andResume, checkConfig);

层层调用调用了下面代码

// Create activity launch transaction.
// 创建activity 启动的 transaction
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.appToken);

//省略代码
// Schedule transaction.
// 通过 ActivityTaskManagerService 获取LifecycleManager 调用 transaction
mService.getLifecycleManager().scheduleTransaction(clientTransaction);

9.这里的LifecleManager就是ClientLifecycleManager,查看ClientLifecycleManager类种的scheduleTransaction方法

void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
final IApplicationThread client = transaction.getClient();
// 这里执行了ClientTransaction的schedule方法
transaction.schedule();
if (!(client instanceof Binder)) {
// If client is not an instance of Binder - it's a remote call and at this point it is
// safe to recycle the object. All objects used for local calls will be recycled after
// the transaction is executed on client in ActivityThread.
transaction.recycle();
}
}

10.执行了ClientTransaction类中的schedule方法

public void schedule() throws RemoteException {
mClient.scheduleTransaction(this);
}

11.这里的mClient就是ActivityThread,查看ActivityThread\

@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
//ActivityThread.this就是 ClientTransactionHandler ,因为ActivityThread 继承自 ClientTransactionHandler
ActivityThread.this.scheduleTransaction(transaction);
}

12.查看ClientTransactionHandler的scheduleTransaction方法

void scheduleTransaction(ClientTransaction transaction) {
// 这里调用了 ClientTransaction 的 preExecute 方法
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

13.发了个message给ActivityThread的H


case EXECUTE_TRANSACTION:
final ClientTransaction transaction = (ClientTransaction) msg.obj;
//通过 TransactionExecutor 执行
mTransactionExecutor.execute(transaction);
if (isSystem()) {
// Client transactions inside system process are recycled on the client side\
// instead of ClientLifecycleManager to avoid being cleared before this\
// message is handled.
transaction.recycle();
}
// TODO(lifecycler): Recycle locally scheduled transactions.
break;

14.查看mTransactionExecutor.execute方法

// 执行这个方法
executeCallbacks(transaction);

查看该方法

// 这个方法里面调用了创建activity实例的方法
cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
// cycleToPath中调用了下面的方法

// 这里的 mTransactionHandler 是 ClientTransactionHandler
// 而 ActivityThread 继承自 ClientTransactionHandler 所以调用的是
// ActivityThread 的 handleLaunchActivity 方法
mTransactionHandler.handleLaunchActivity(r, mPendingActions,
null /* customIntent */);

15.又回到的ActivityThread,调用了handleLaunchActivity方法,其中又调用了performLaunchActivity方法

activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);\

16.回到Instrumentation中最后是调用了AppComponentFactory的instantiateActivity方法,通过反射创建了Activity\

public @NonNull Activity instantiateActivity(@NonNull ClassLoader cl, @NonNull String className,
@Nullable Intent intent)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
// 这里用发射的方式创建了activity
return (Activity) cl.loadClass(className).newInstance();
}