-
主要流程解析:
1. Launcher请求AMS过程
Launcher -> Activty -> Instrumetation -> IActivityManager -> AMS

调用startActivity,会调用startActivityForResult:
@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中调用mInstrumentation.execStartActivity方法
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
...
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
...
}
execStartActivity中调用ActivityTaskManager.getService():
int result = ActivityTaskManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
/** @hide */
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
IActivityManager是通过AIDL跨进程通信获取到binder对象,它的实现类是ActivityManagerService。
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);
}
};
ActivityTaskManagerService中调用startActivity,跟AMS进行跨进程通信。
@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());
}

2. AMS到ApplicationThread的调用过程
AMS -> ActivityStarter -> ActivityStackSupervisor -> ActivityStack -> ApplicationThread

然后获取ActivityStarter,
@Override
public ActivityStarter obtain() {
ActivityStarter starter = mStarterPool.acquire();
if (starter == null) {
starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
}
return starter;
}
ActivityStarter是Android7.0中新加入的类,它是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为Activity,并将Activity和Task以及Stack相关联。
然后调用ActivityStack,
ActivityStack是Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
获取ApplicationThread,通过ApplicationThread来与应用程序进程进程Binder通信(跨进程通信),也就是说ApplicationThread是AMS和应用程序进程的通信桥梁。
3. ApplicationThread启动Activity的过程
ApplicationThread ->ActivityThread -> H类 (hander) -> Instrumentation->Activity

ActivityThread类内部:
public final class ActivityThread extends ClientTransactionHandler {
final ApplicationThread mAppThread = new ApplicationThread();
final H mH = new H();
}
ApplicationThread是ActivityThread的内部类,ActivityThread负责管理当前应用程序进程的主线程。H,它是ActivityThread的内部类并继承自Handler,是应用程序进程中主线程的消息管理类。
scheduleLaunchActivity通过sendMessage向H类发送类型为LAUNCH_ACTIVITY的消息,H类的handleMessage方法,处理消息,调用ActivityThread的handleLaunchActivity,接着调用performLaunchActivity,又回到应用程序与系统交互的监控类Instrumentation,Instrumentation调用activity的oncreate方法,开启activity的生命周期。
Instrumentation: 每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的具体管理与实现,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
参考:https://www.cnblogs.com/anni-qianqian/p/10175729.html
3分钟看懂Activity启动流程
https://blog.csdn.net/my_csdnboke/article/details/106173074
网友评论