最近在学插件化相关的,要求启动一个没有安装的app中的activity(没有AndroidManifest注册),这就要求对代理模式和activity的启动流程有一定的了解。hook正常的activity启动流程。
一、先看源码,把流程弄出来。
a,首先当我们startActivity(xIntent)时.会调用Activity中的startActivity方法
b,这个方法调用自己的重载方法
c,由于上面传进来 options为null,所以进else,到这里startAcitity变成了startActivityForResult
d,继续点进去
e,重点为带箭头的部分,我们找到mInstrumentation这个类,并查看里面的execStartActivity方法
f,重点仍然是带箭头的部分,这里需要注意ActivityManagerNative是一个抽象类,所以具体的实现代码需要找他的子类AMS,下面我们去AMS中看这个startActivity方法
g,接着我们点进去看startActivityAsUser
h,这里mStackSupervisor字面意思是栈管理者,继续点进去看
这里解析activityInfo,参数等
最终调用startActivityLoked方法
i,点进这个方法看
做了很多的错误判断,
j,这里调用了startActivityUncheckedLocked再点进去看
这个方法里面,做了一些启动模式的处理
k,点进resumeTopActivitiesLocked方法
l,继续点进去看
m,继续看resumeTopActivityInnerLocked方法
n,这里调用startPausingLocked方法看样子是要onpause最上层的activity,点进去看
o,果然这里调用了schedulePauseActivity方法,继续去看。这里不能直接点进去,但是熟悉源码之后就会知道prev.app.thread就是ApplicationThread,也就是在ActvityThread的内部类。我们去找找看。
p,果然在activityThread中找到了
q,这里是一个判断,是否结束是发生finish消息,不结束就发送pasu消息。我们就去看H.PAUSE_ACTIVITY是怎么处理的,
H也是ActivityThread的内部类。
r,这里执行handlePauseActivity方法,进去看。
s,执行performPauseActivity方法。
t,在进去看
u,在进去看
Activity类中
至此启动另一个activity执行的第一个生命周期出现了。
接着再回到r步,ApplicationThread的handlePauseActivity方法,我们来找新的acitivy的启动流程。
1,进入handlePauseActivity方法了。
2.这次我们已经很熟悉了ActivityManagerNative.getDefault().就是AMS,我们直接去AMS找到这个方法
3,再点进去看
4,进入箭头指示的方法,
5,这一句是重点resumeTopActivitiesLocked,进去看
6,再进入resumeTopActivityLocked查看
7,再点进去
8,在resumeTopActivityInnerLocked这个方法的末尾,有这么一句。
9,再去看realStartActivityLocked方法
10,这里可以看出应该是去launchAcivity了。我们去ActivityThread中看看
11,设置各种值之后,发送消息,我们去H中看看,
12.进入handleLaunchActivity方法
13, 看到perfome就知道不远了,继续看
14,这里我们知道activity实例的创建是通过反射的,与oncreate生命周期无关,继续看
15.这里还创建context,attach,设置Theme,还是无关,继续看
16,看到了Activity的oncreate,继续。
17,到这里就调用了activity的oncrete生命周期。
18.onstart以及其他的生命周期都是类似的。
二、然后再总结一下细节的地方。
首先darren大哥的总结https://www.jianshu.com/u/35083fcb7747
- ** ActivityManagerService** 组件通信系统核心管理类 (ActivityManagerNative)IPC通信-Binder子类
- ** ActivityStackSupervisor** 管理整个手机的Activity任务栈
- ActivityStack Activity栈(任务栈)
- ** PackageManagerService** 主要负责对系统的apk进行管理,不管是系统apk(/system/app),还是我们手工安装上去的,系统所有的apk都是由其管理的。
- ** ActivityThread** Activity的入口是onCreate方法,Android上一个应用的入口是ActivityThread。和普通的Java类一样有一个main方法。用于控制与管理一个应用进程的主线程的操作,包括管理与处理activity manager发送过来的关于activities、广播以及其他的操作请求