先上栈信息
这里我在源码里面加入了一句log
``
我们先正向分析,后面再结合反向堆栈反查快速撸完整个流程。
点完一共就这么几个类
从Activity的startactivity一直点,出现了Instrumentation这个类
alt+7简单看下其成员,发现了ActivityThread,我们大概知道他主要是ActivityThread的一个包装类
到了这里是去获取AMS了,要知道AMS就是和ActivityThread交互,一个服务端一个客户端,这也就说明了Instrumentation 其实就是ActivityTheread的一个包装类。
继续向下,点到IActivityManager中,这个是一个AIDL编译产生的的java文件,所以需要先编译一下才会有这个继承提示。
ASM继承Stub也就是说他就是IActivityManager的具体实现。
一直往下,到了startActivityUnchecked我们发现,已经出现了三个我们陌生的类了。
ActivityStarter 我们简单看下成员,猜测其功能
有ASM那它也是AMS的包装类,注意其中的MyTargetStack就是我们最终要跳转的实例,这个是后面发现。
接下来看下ActivityStack,他居然同时有AMS和WMS两个类,同时有ActivityRecord和TaskRecord两个类,我们就不展开了,大胆的猜测ActivityRecord是Activity,也就是每个活动的信息,TaskRecord就是栈信息,他存储ActivityRecord和Activity的状态信息,如Resume,Pause。
最后我们看下这个mTargetStack,我理解它是我们要跳转的界面的堆栈管理器,从成员中可以推测。
简单追踪一下
相当于是判断这个app 和thread在不在,其实就是调用ActivityThread的ApplicationThread的具体实现,我们知道ApplicationThread是个AIDL,他最终一定会调用AMS的AIDL
后面就是我们常见的oncreat pause resume等生命周期的事情,
我们需要关系的是以下这个ContextImpl,有了它,Activity才能进行startServices操作,这也是我前一篇讲到的 https://blog.youkuaiyun.com/qq_20330595/article/details/145949379