最近在学插件化相关的,要求启动一个没有安装的app中的activity(没有AndroidManifest注册),这就要求对代理模式和activity的启动流程有一定的了解。hook正常的activity启动流程。

一、先看源码,把流程弄出来。

a,首先当我们startActivity(xIntent)时.会调用Activity中的startActivity方法

Activity启动流程

b,这个方法调用自己的重载方法

Activity启动流程

c,由于上面传进来 options为null,所以进else,到这里startAcitity变成了startActivityForResult

Activity启动流程

d,继续点进去

Activity启动流程

e,重点为带箭头的部分,我们找到mInstrumentation这个类,并查看里面的execStartActivity方法

Activity启动流程

f,重点仍然是带箭头的部分,这里需要注意ActivityManagerNative是一个抽象类,所以具体的实现代码需要找他的子类AMS,下面我们去AMS中看这个startActivity方法

Activity启动流程

g,接着我们点进去看startActivityAsUser

Activity启动流程

h,这里mStackSupervisor字面意思是栈管理者,继续点进去看

Activity启动流程

这里解析activityInfo,参数等

Activity启动流程

最终调用startActivityLoked方法

i,点进这个方法看

Activity启动流程

做了很多的错误判断,

Activity启动流程

j,这里调用了startActivityUncheckedLocked再点进去看

Activity启动流程

这个方法里面,做了一些启动模式的处理

Activity启动流程

k,点进resumeTopActivitiesLocked方法

Activity启动流程

l,继续点进去看

Activity启动流程

m,继续看resumeTopActivityInnerLocked方法

Activity启动流程

n,这里调用startPausingLocked方法看样子是要onpause最上层的activity,点进去看

Activity启动流程

o,果然这里调用了schedulePauseActivity方法,继续去看。这里不能直接点进去,但是熟悉源码之后就会知道prev.app.thread就是ApplicationThread,也就是在ActvityThread的内部类。我们去找找看。

p,果然在activityThread中找到了

Activity启动流程

q,这里是一个判断,是否结束是发生finish消息,不结束就发送pasu消息。我们就去看H.PAUSE_ACTIVITY是怎么处理的,

H也是ActivityThread的内部类。

Activity启动流程

r,这里执行handlePauseActivity方法,进去看。

Activity启动流程

s,执行performPauseActivity方法。

Activity启动流程

t,在进去看

Activity启动流程

u,在进去看

Activity启动流程

Activity类中

Activity启动流程

至此启动另一个activity执行的第一个生命周期出现了。

接着再回到r步,ApplicationThread的handlePauseActivity方法,我们来找新的acitivy的启动流程。

1,进入handlePauseActivity方法了。

Activity启动流程

2.这次我们已经很熟悉了ActivityManagerNative.getDefault().就是AMS,我们直接去AMS找到这个方法

Activity启动流程

3,再点进去看

Activity启动流程

4,进入箭头指示的方法,

Activity启动流程

5,这一句是重点resumeTopActivitiesLocked,进去看

Activity启动流程

6,再进入resumeTopActivityLocked查看

Activity启动流程

7,再点进去

Activity启动流程

8,在resumeTopActivityInnerLocked这个方法的末尾,有这么一句。

Activity启动流程

9,再去看realStartActivityLocked方法

Activity启动流程

10,这里可以看出应该是去launchAcivity了。我们去ActivityThread中看看

Activity启动流程

11,设置各种值之后,发送消息,我们去H中看看,

Activity启动流程

12.进入handleLaunchActivity方法

Activity启动流程

13, 看到perfome就知道不远了,继续看

Activity启动流程

14,这里我们知道activity实例的创建是通过反射的,与oncreate生命周期无关,继续看

Activity启动流程

15.这里还创建context,attach,设置Theme,还是无关,继续看

Activity启动流程

16,看到了Activity的oncreate,继续。

Activity启动流程

17,到这里就调用了activity的oncrete生命周期。

Activity启动流程

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、广播以及其他的操作请求





相关文章: