Android大致分为了四层,即Linux内核层、库和运行时、Framework层和应用层。
Dalvik与ART
Dalvik包含了一整套的Android运行环境虚拟机,每个App都会分配Dalvik虚拟机来保证互相之间不受干扰,并保持独立。它的特点是在运行时编译。打个比方,就好比你买了一辆可折叠的自行车,平时是折叠的,只有骑的时候,才需要组装起来用。而在Android 5.X版本开始,ART模式已经取代了Dalvik, ART采用的是安装时就进行编译,以后运行时就不用编译了,这就好比你买了辆组装好了的自行车,装好就可以骑了。当然,对在其虚拟机环境中运行的大部分App来说,它们都运行着同样的代码。
Android应用程序会在如下所示的几个时间点创建应用上下文Context。
创建Application
创建Activity
创建Service
IDE是无法完成的,比如自动化编译、定制编译、版本控制、自动测试等。因此Android与很多语言一样,引入了Makefile机制。
view树结构图
ui界面架构图
标准视图树
类——MeasureSpec类,通过它来帮助我们测量View。MeasureSpec是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小,在计算中使用位运算的原因是为了提高并优化效率。
测量的模式可以为以下三种。
EXACTLY
即精确值模式,当我们将控件的layout_width属性或layout_height属性指定为具体数值
AT_MOST
即最大值模式,当控件的layout_width属性或layout_height属性指定为wrap_content时,
UNSPECIFIED
这个属性比较奇怪——它不指定其大小测量模式,View想多大就多大,通常情况下在绘制自定义View时才会使用。
View类默认的onMeasure()方法只支持EXACTLY模式,所以如果在自定义控件的时候不重写onMeasure()方法的话,就只能使用EXACTLY模式。控件可以响应你指定的具体宽高值或者是match_parent属性。而如果要让自定义View支持wrap_content属性,那么就必须重写onMeasure()方法来指定wrap_content时的大小。
ViewGroup会去管理其子View,其中一个管理项目就是负责子View的显示大小。当ViewGroup的大小为wrap_content时,ViewGroup就需要对子View进行遍历,以便获得所有子View的大小,从而来决定自己的大小。
在自定义ViewGroup时,通常会去重写onLayout()方法来控制其子View显示位置的逻辑。同样,如果需要支持wrap_content属性,那么它还必须重写onMeasure()方法,这点与View是相同的。
ViewGroup会使用dispatchDraw()方法来绘制其子View,其过程同样是通过遍历所有子View,并调用子View的绘制方法来完成绘制工作。
在View中通常有以下一些比较重要的回调方法。
onFinishInflate():从XML加载组件后回调。
onSizeChanged():组件大小改变时回调。
onMeasure():回调该方法来进行测量。
onLayout():回调该方法来确定显示的位置。
onTouchEvent():监听到触摸事件时回调。
通常情况下,有以下三种方法来实现自定义的控件。
对现有控件进行拓展
通过组合来实现新的控件
重写View来实现全新的控件