考察要点:
此处以跨进程启动Activity分析一下源码流程:
```
mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);
...
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags){
switch(code){
case START_ACTIVITY_TRANSACTION:{
startActivity(app,callingPackage,intent,...)
}
}
}
```
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2020/2/7/1702043547d09967~tplv-t2oaga2asx-watermark.image)
```
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);
//生成ContextImpl
Context appContext = createBaseContextForActivity(r,activity);
//给activity绑定上下文和一些初始化的工作,如createPhoneWindow
activity.attach(appContext,...);
mInstrumentation.callActivityOnCreate(activity,r.state); //生命周期的OnCreate
activity.performStart(); //生命周期的OnStart
return activity
```
```
-> r.activity.performResume()
-> mInstrumentation.callActivityOnResume(this);
-> activity.onResume()
```
本文转自 https://juejin.cn/post/6844904058688372750,如有侵权,请联系删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。