准备荧光棒
众所周知,我们Android的View加载过程在as中是不能很好的去查看的,所以会用到工具Source Insight 4.0
破解版网址Source Insight 4.0破解版 下载Android源码Android4.4源码 提取码:k8hi
Android8.0太大了,我怕你不太想下
中国是有很多高手的,不然那么多外挂和破解版哪里来的,嘿嘿
跟随脚步不要停
1.打开我们的工具搜索Acivity.java
2.找到我们的setContentView()方法
有三个
在看看它的代码
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}
一个是通过获取窗口
一个是显示标题
3.在看看我们的getWindow()
4.最后在这里找到了它的实例
5.最终是通过PolicyManager,它主要用于创建Window类、LayoutInflater类和WindowManagerPolicy类,它扮演着简单工厂模式中的工厂类角色,而抽象产品角色由IPolicy接口实现,具体产品角色由Policy类实现。
我看了一下,可能是Android4.4的源码比较老了,我就不拿源码讲了,我讲一下它的大概加载过程
- 创建一个DecorView的对象mDecor,该mDecor对象将作为整个应用窗口的根视图。
- 依据Feature等style theme创建不同的窗口修饰布局文件,并且通过findViewById获取Activity布局文件该存放的地方(窗口修饰布局文件中id为content的FrameLayout)。
- 将Activity的布局文件添加至id为content的FrameLayout内。
- 当setContentView设置显示OK以后会回调Activity的onContentChanged方法。Activity的各种View的findViewById()方法等都可以放到该方法中,系统会帮忙回调。
6.我交给大家的可能不是一个非常透彻加载过程,但是我更希望你们能够自己主动去查看源码。大概的加载过程图是这样的
你可以理解为是从外到内的加载
getWondow() --PhoneWindow,
PhoneWindow–setContentView(),
setContentView()–installDecor(),
installDecor()–generateDecor()和generateLayout(),
最终在generateLayout()会加载布局文件R.layout.screen_title
这时候你就知道为什么xml文件中会有一个标题
<LinearLayout>
<ViewStub/>//加载主题
<FrameLayout>
<TextView/>//加载app标题
</FrameLayout>
<Framelayout/>//加载布局
</LinearLayout>
具体的加载过程我引用了大佬的图片
买了佛冷
可能这个源码讲解有点难度,我个人是喜欢即兴写博客的,纯当我聊聊天,瞎分享,哪里有问题请及时指出,谢谢。那么下一次我可能就不分享事件分发了,有兴趣的可以自己去看看源码,怎么看的方法我以及分享了,但是给你个大概的事件分发关系代码
public boolean dispatchTouchEvent(MotionEvent ev){
boolean result=false;
if(onInterceptTouchEvent(ev)){
result=onTouchEvent(ev);
}else if{//这个是表示有小徒弟
result=child.dispatchTouchEvent(ev);
}
return result;
}
点击事件分发的规则大概的意思是
敌人来犯,老的看有没有小的徒弟,没有就自己上,有就叫徒弟上,小的如果打不过了,老的来,老的打不过,老祖来…