1. Activity的组成 以及 绘制的流程
结构组成:Activity是由最外层的PhoneWindow包裹着它的内部类DecorView,DecorView中又根据不同的情况加载不同的布局,(带有Title或不带)+ContentView.
流程:
先说说DecorView的创建过程: Activity的初始化流程是从第一次setContentView开始,activity的setContentView方法直接调用PhoneWindowView的setContentView方法,而在它的setContentView方法中,会判断mContentParent是否为空来选择是否创建新的DecorView,这里的mContentParent可以理解为DecorView或者它的子View,至此,DecorView创建完成。
而Activity的绘制流程是,当调用Activity的StartActivity之后会调用ActivityTread的handleLauncherActivity方法,该方法中首先调用performLauncherActivity创建Activity,这个方法中会调用Activity的onCreat方法,而DecorView也是在这一步创建完成。之后会调用handlerResumeActivity()方法,该方法中调用了Activity的onResume,该方法中会获取到windowManager的实例,并通过windowManager的addView方法添加我们刚刚创建好的DecorView,而windowManager的addView方法中通过ViewRootImpl的setView方法添加到window当中,然后在进行View的measure,layout,draw三大流程将Activity最终展示在我们面前。
2.View的事件分发
分两部分:
View,View中主要包含了两个事件,dispatchTouchEvent和onTouchEvent两个事件。
ViewGroup中主要包含了三个,除了View中包含的两个事件外,还有一个onInterceptTouchEvent。
ViewGroup和View呈现树状结构,事件的分发是通过dispatchTouchEvent进行的,值得一提的是,此处分发的事件为Down事件(一次Touch事件由Down,若干Move,Up三部分组成,Move次数可以为零)ViewGroup会在该方法中通过遍历子View调用子View的dispatchTouchEvent来寻找真正要处理本次事件的子View,当有子View的dispatchTouchEvent事件返回true时,就会停止事件分发,并将该子View的记录在它的上层View中,最后执行onTouchEvent事件进行处理。当子View没有任何一个返回true的时候,ViewGroup就会执行自身父类的dispatchTouchEvent方法,ViewGroup继承于View,因此通过View的dispatchTouchEvent去执行onTouchEvent事件。
onInterceptTouchEvent是用来拦截Down事件的分发的。
onTouchListener方法中的onTouch事件优先级要高于onTouchEvent()事件;
3.View的measure,layout,draw三大流程,今天看得云里雾里的,没搞懂,明天继续。
明日计划:
1.View的三大流程
2.自定义View