准备荧光棒

众所周知,我们Android的View加载过程在as中是不能很好的去查看的,所以会用到工具Source Insight 4.0
破解版网址Source Insight 4.0破解版 下载Android源码Android4.4源码 提取码:k8hi
Android8.0太大了,我怕你不太想下
中国是有很多高手的,不然那么多外挂和破解版哪里来的,嘿嘿

跟随脚步不要停

1.打开我们的工具搜索Acivity.java

ios 加载xib定义的view view加载流程_Android


2.找到我们的setContentView()方法

ios 加载xib定义的view view加载流程_ios 加载xib定义的view_02


有三个

在看看它的代码

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
    initActionBar();
}

一个是通过获取窗口

一个是显示标题

3.在看看我们的getWindow()

ios 加载xib定义的view view加载流程_ios 加载xib定义的view_03


4.最后在这里找到了它的实例

ios 加载xib定义的view view加载流程_view的加载过程_04


5.最终是通过PolicyManager,它主要用于创建Window类、LayoutInflater类和WindowManagerPolicy类,它扮演着简单工厂模式中的工厂类角色,而抽象产品角色由IPolicy接口实现,具体产品角色由Policy类实现。

我看了一下,可能是Android4.4的源码比较老了,我就不拿源码讲了,我讲一下它的大概加载过程

  1. 创建一个DecorView的对象mDecor,该mDecor对象将作为整个应用窗口的根视图。
  2. 依据Feature等style theme创建不同的窗口修饰布局文件,并且通过findViewById获取Activity布局文件该存放的地方(窗口修饰布局文件中id为content的FrameLayout)。
  3. 将Activity的布局文件添加至id为content的FrameLayout内。
  4. 当setContentView设置显示OK以后会回调Activity的onContentChanged方法。Activity的各种View的findViewById()方法等都可以放到该方法中,系统会帮忙回调。

6.我交给大家的可能不是一个非常透彻加载过程,但是我更希望你们能够自己主动去查看源码。大概的加载过程图是这样的

ios 加载xib定义的view view加载流程_ios 加载xib定义的view_05


你可以理解为是从外到内的加载

getWondow() --PhoneWindow,

PhoneWindow–setContentView(),

setContentView()–installDecor(),

installDecor()–generateDecor()和generateLayout(),

最终在generateLayout()会加载布局文件R.layout.screen_title

这时候你就知道为什么xml文件中会有一个标题

<LinearLayout>
	<ViewStub/>//加载主题
	<FrameLayout>
		<TextView/>//加载app标题
	</FrameLayout>
	<Framelayout/>//加载布局
</LinearLayout>

具体的加载过程我引用了大佬的图片

ios 加载xib定义的view view加载流程_ios 加载xib定义的view_06

买了佛冷

可能这个源码讲解有点难度,我个人是喜欢即兴写博客的,纯当我聊聊天,瞎分享,哪里有问题请及时指出,谢谢。那么下一次我可能就不分享事件分发了,有兴趣的可以自己去看看源码,怎么看的方法我以及分享了,但是给你个大概的事件分发关系代码

public boolean dispatchTouchEvent(MotionEvent ev){
	boolean result=false;
	if(onInterceptTouchEvent(ev)){
		result=onTouchEvent(ev);
	}else if{//这个是表示有小徒弟
		result=child.dispatchTouchEvent(ev);
	}
	return result;
}

点击事件分发的规则大概的意思是
敌人来犯,老的看有没有小的徒弟,没有就自己上,有就叫徒弟上,小的如果打不过了,老的来,老的打不过,老祖来…