Activity的启动流程
-
-
-
- 1,`Activity#startActivityForResult`:
- 2,`Instrumentation#execStartActivity`:
- 3,`ActivityTaskManagerService#startActivity`:
- 4,`ActivityTaskManagerService#startActivityAsUser`:
- 5,`ActivityStarter#execute`:
- 6,`ActivityStarter#startActivityInner`:
- 7,`RootWindowContainer#resumeFocusedStacksTopActivities`:
- 8,`ActivityStack#resumeTopActivityUncheckedLocked`:
- 9,`ActivityStack#resumeTopActivityInnerLocked`:
- 10,`ActivityStack#startPausingLocked`:
- 11,`ClientLifecycleManager#scheduleTransaction`:
- 12,`ClientTransaction#schedule`:
- 13,`ApplicationThread#scheduleTransaction`:
- 14,`TransactionExecutor#execute`:
- 15,`ActivityThread#performLaunchActivity`:
- 16,`Instrumentation#callActivityOnCreate`:
- 17,`Activity#performCreate`:
-
-
在开发中,我们并不是使用new
关键字创建Activity
的,通常启动一个Activity
的方式如下:
startActivity(new Intent(this, MainActivity.class));
Activity
有自己的生命周期,通常意义上的生命周期第一步是onCreate
。那么一个Activity
是如何由startAcitivity
走向onCreate
的呢?
Google也在不断的对其SDK进行更新迭代。所以,不同的Android版本(谷歌分别在Android8.0、10.0、11.0三个版本都做过修改),其启动流程也有一些区别,不过整体流程上还是基本一致的。本文以当前最新的 Android11.0(API30) 为目标版本,直接从源码的走向来观察一个Activity
的启动流程。。
先上一张图:
1,Activity#startActivityForResult
:
Activity
中有多个启动Activity
的方法,当我们调用其中一个startActivity
方法时,最终都会走向下面的startActivityForResult
(只保留关键代码):
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
>>>
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
>>>
- Instrumentation:用于实现应用程序插装代码的基本类,主要负责
Activity
和Application
的创建和生命周期调用。在运行时,这个类将在任何应用程序代码之前被实例化,从而允许我们监视系统与应用程序的所有交互。系统是通过AndroidManifest.xml
对系统描述插装实现的。
2,Instrumentation#execStartActivity
:
方法在不同得API版本中有一些区别:
Target<=API25:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
>>>
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);//Activity是否在Manifast中注册过,就是在这个方法里校验的。
>>>
}
在8.0之前的版本中通过ActivityManagerNative.getDefault
获取ActivityManagerService
的实例来调用其startActivity
方法。
API26<=Target<=API28:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
>>>
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target, requestCode, 0, null, options);
checkStartActivityResult(result, intent);//Activity是否在Manifast中注册过,就是在这个方法里校验的。
>>>
}
在Android10之前的版本是通过ActivityManager.getService
获取ActivityManagerService
的实例来调用其startActivity
方法。
API29<=Target:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
>>>
int result = ActivityTaskManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);//Activity是否在Manifast中注册过,就是在这个方法里校验的。
>>>
}
从Android10开始的版本是通过ActivityTaskManager.getService
获取ActivityTaskManagerService
的实例来调用其startActivity
方法。这篇文章我们只看Android10之后的版本。
- ActivityTaskManager:此类提供有关
activities
及其容器(如任务、堆栈和Display)的信息并与之交互。
ActivityTaskManager#getService
:
点击getService
发现直接跳转到下面这个方法:
/** @hide */
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
返回值是一个IActivityTaskManager
类型的对象。
- IActivityTaskManager:
IActivityTaskManager
继承了IInterface
,是AMS
在app进程的binder
代理对象。app进程通过ActivityTaskManager.getService
返回的IActivityTaskManager
来调用系统进程AMS
中的方法。ActivityTaskManagerService
实现了IActivityTaskManager.Stub
。
ActivityTaskManager#IActivityTaskManagerSingleton
:
@UnsupportedAppUsage(trackingBug = 129726065)
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
};
public abstract class Singleton<T> {
@UnsupportedAppUsage
private T mInstance;
protected abstract T create();
@UnsupportedAppUsage
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
- Singleton:是一个用于延迟初始化的单例助手类。
IActivityTaskManagerSingleton.get()
返回的值即为Singleton#create
中返回的值。
所以,最终execStartActivity
方法中调用的startActivity
其实是ActivityTaskManagerService
中的startActivity
方法。
- ActivityTaskManagerService:用于管理
activity
及其容器(任务、堆栈、Display等)的系统服务。
3,ActivityTaskManagerService#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());
}
4,ActivityTaskManagerService#startActivityAsUser
:
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) {
>>>
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType