context的初始化过程:https://www.jianshu.com/p/7d4b605f5060
----------------------------------------------------------------------------------------------------------------------------------------------
系统级别的Context实例化过程:
SystemServer的run方法中,调用createSystemContext方法
通过ActivityThread的systemMain方法创建了一个系统级别的ActivityThread
调用activityThread的attach方法,传入true。
该方法创建了application并调用了onCreate方法。
以上是系统级别的context实例化过程,为了弄清activity这个context是如何实例化的,就得研究一下activity的启动过程。https://blog.csdn.net/qq_23547831/article/details/51224992
需要注意的是activity,service启动activity的过程都各不一样,activity复写了startActivity方法,service直接调用了父类的方法。
activity之所以要复写startActivity方法,是为了复用activity独有的startActivityForResult方法。
最终都会调用到Instrumentation的启动activity方法,再调用ActivityManagerNative
很明显,启动activity使用了binder。
这个"activity"为key的service是何时添加的呢?
我尝试着在SystemServer里找,但是没有找到。在ActivityManagerService自身的代码里找到。而setSystemProcess在SystemServer里被调用。
ActivityManagerService的实例是怎么创建出来的呢?
上面根据字节码反射创建了service的实例,实例实际是ActivityManagerService的内部类:Lifecycle.
调用了
getService方法得到了真正的ActivityManagerService.
调用了service的onStart方法。
上面说了这么多,关于ActivityManagerService创建的过程。
但是疑问尚在:
1)activity怎么就具备了context的特性了,它也没有new,怎么使之成为一个context。
2)startActivity怎么android系统就会弹出一个界面
前面
开启activity,最终会通过Binder机制(数据传输机制比较麻烦,后面研究)跨进程调用
ActivityManagerServcie的startActivityAsUser方法:
继而调用ActivityStarter的startActivityMayWait方法
在方法中又会调用到startActivityLocked方法
方法最后会调用到 startActivityUnchecked方法
最终调用了ActivityStack的startActivityLocked方法:
注意下面这部分代码,不同版本的源码会有很大的区别。
1)首先判断开启的activity是否是新任务,分别做不同的处理。
2)主要是调用WindowManager
***准备事务
***添加token
调用WindowManagerService的H来发送消息
注意ensureActivitiesVisibleLocked这个方法
接着方法调用顺序:
makeVisibleAndRestartIfNeeded (ActivityStack)
startSpecificActivityLocked (ActivityStackSupervisor)
realStartActivityLocked (ActivityStackSupervisor)
此方法内部会调用 app.thread.scheduleLaunchActivity,这个app.thread是IApplicationThread类的实例,具体的子类是哪个呢?
下面的源码为API26
app即Proce***ecord类
在里面搜索thread的set方法:
makeActive点击发现有2处引用:
引用1:
引用2:
找到上一个调用的地方
由上面的分析可知:app.thread的thread是ActivityThread
下面看它的scheduleLaunchActivity方法,看它是如何启动Activity的:
1)发送消息给H这个Handler
2)handler的处理
实例化了Activity的对象:
通过Instrumentation的newActivity方法创建了Activity的实体: