App启动流程
安卓main方法的加载关系到四个进程,Launcher、ss、Zygote、App。
1.首先Launcher收集当前app上下文,,然后找到ss进程的AMS,Ams请求Zygote进程fork一个新的app进程,然后会调用ActivityThread里的main。
2.以上是main启动之前的工作。本质上是AMS和ActivityThread两个类协作完成生命周期的调用。
3.main加载后进行attach通过binder机制调用AMS,直接把ActivityThread生成了一个对象发给了AMS。知道这是main方法基本没干啥事,实际上主要工作是AMS给ActivityThread发送了一个scheduleLaunchActivity(startActivityNow)。这是activity的信息包,实际上是在进行handler信息通信。
4.performLaunchActivity用于通知ActivityThread中的handleLaunchActivity根据switch-case创建Activity,创建过程是通过反射getclass。
5.activity创建之后,handler调用performLaunchActivity,它会调用callActivityOncreate,又会调用Activity.performOnCreate,最后调用onCreate()。
6.AMS主要负责的是监控状态并进行变更,触发之后发送一条handler消息进行处理。
setContentView()
我们创建了一个空的activity之后,它其实没有界面,所以需要一个view,这个view就是phoneWindow,已经创建了但是没有内容。
public void setContentView(int resId) {
ensureSubDecor(); //根视图
ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
//ViewGroup是一种特殊的View,是布局和视图容器的基类。
contentParent.removeAllViews();
LayoutInflater.from(mContext).inflate(resId, contentParent);
mAppCompatWindowCallback.getWrapped().onContentChanged();
}
inflate递归加载布局,把xml文件都加载到phoneWindow,然后调用onContentChanged()。
DecorView添加到Window过程
在onResume加载
performTraversals()负责具体的测量、布局、绘制。