考察要点:

此处以跨进程启动Activity分析一下源码流程:
```mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);...@Overridepublic boolean onTransact(int code, Parcel data, Parcel reply, int flags){ switch(code){ case START_ACTIVITY_TRANSACTION:{ startActivity(app,callingPackage,intent,...) } }}``` ```IActivityManager mgr = ActivityManagerNative.getDefault();```获取到AMS的Binder代理对象,然后调用 ```mgr.attachApplication(mAppThread);```mAppThread是应用端的一个Binder对象ApplicationThread,也就是最上面一张图的ATP,这样AMS端就可以调用应用端了。```mStactSupervisor.attachApplicationLoacked(app);```初始化挂起的Activity对象。```ActivityRecord hr = stack.topRunningActivityLocked(null);```其中要明白AMS里面有两个栈,一个是Launch桌面栈,一个就是非桌面栈mFocusedStack,此处的stack就是mFocusedStack,它会将栈顶的ActivityRecord返回出来,我们的目标Activity早就放置在了栈顶,只是一直没有初始化。然后调用```realStartActivityLocked(hr,app,true,true);```方法,来启动Activity,如果我们不是启动另外一个进程,而是同一进程,那么这第二大部分就不会存在了,而是直接调用realStartActivityLocked方法。```ActivityClientRecord r = new ActivityClientRecord();...sendMessage(H.LAUNCH_ACTIVITY,r);```封装了一个ActivityClientRecord消息,然后丢到主线程的Handler(mH)里。```final ActivityClientRecord r = (ActivityClientRecord)msg.obj ;r.packageInfo = getPackageInfoNoCheck(...);handleLaunchActivity(r,null);```**getPackageInfoNoCheck** 函数主要是用来生成一个LoadedApk对象,它用来保存我们的apk信息,因为后面我们需要一个ClassLoader去加载Apk里面的Activity类,所以这里提前准备好。```Activity activity = mInstrumentation.newActivity(...);//返回之前创建好的Application app = r.packageInfo.makeApplication(false,mInstrumentation);//生成ContextImplContext appContext = createBaseContextForActivity(r,activity);//给activity绑定上下文和一些初始化的工作,如createPhoneWindowactivity.attach(appContext,...);mInstrumentation.callActivityOnCreate(activity,r.state); //生命周期的OnCreateactivity.performStart(); //生命周期的OnStartreturn activity``````-> r.activity.performResume() -> mInstrumentation.callActivityOnResume(this); -> activity.onResume()```本文转自 https://juejin.cn/post/6844904058688372750,如有侵权,请联系删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。