Android大致分為了四層,即Linux內(nèi)核層、庫(kù)和運(yùn)行時(shí)、Framework層和應(yīng)用層。
Dalvik與ART
Dalvik包含了一整套的Android運(yùn)行環(huán)境虛擬機(jī),每個(gè)App都會(huì)分配Dalvik虛擬機(jī)來(lái)保證互相之間不受干擾,并保持獨(dú)立。它的特點(diǎn)是在運(yùn)行時(shí)編譯。打個(gè)比方,就好比你買(mǎi)了一輛可折疊的自行車(chē),平時(shí)是折疊的,只有騎的時(shí)候,才需要組裝起來(lái)用。而在Android 5.X版本開(kāi)始,ART模式已經(jīng)取代了Dalvik, ART采用的是安裝時(shí)就進(jìn)行編譯,以后運(yùn)行時(shí)就不用編譯了,這就好比你買(mǎi)了輛組裝好了的自行車(chē),裝好就可以騎了。當(dāng)然,對(duì)在其虛擬機(jī)環(huán)境中運(yùn)行的大部分App來(lái)說(shuō),它們都運(yùn)行著同樣的代碼。
Android應(yīng)用程序會(huì)在如下所示的幾個(gè)時(shí)間點(diǎn)創(chuàng)建應(yīng)用上下文Context。
創(chuàng)建Application
創(chuàng)建Activity
創(chuàng)建Service
IDE是無(wú)法完成的,比如自動(dòng)化編譯、定制編譯、版本控制、自動(dòng)測(cè)試等。因此Android與很多語(yǔ)言一樣,引入了Makefile機(jī)制。

view樹(shù)結(jié)構(gòu)圖

ui界面架構(gòu)圖

標(biāo)準(zhǔn)視圖樹(shù)
類(lèi)——MeasureSpec類(lèi),通過(guò)它來(lái)幫助我們測(cè)量View。MeasureSpec是一個(gè)32位的int值,其中高2位為測(cè)量的模式,低30位為測(cè)量的大小,在計(jì)算中使用位運(yùn)算的原因是為了提高并優(yōu)化效率。
測(cè)量的模式可以為以下三種。
EXACTLY
即精確值模式,當(dāng)我們將控件的layout_width屬性或layout_height屬性指定為具體數(shù)值
AT_MOST
即最大值模式,當(dāng)控件的layout_width屬性或layout_height屬性指定為wrap_content時(shí),
UNSPECIFIED
這個(gè)屬性比較奇怪——它不指定其大小測(cè)量模式,View想多大就多大,通常情況下在繪制自定義View時(shí)才會(huì)使用。
View類(lèi)默認(rèn)的onMeasure()方法只支持EXACTLY模式,所以如果在自定義控件的時(shí)候不重寫(xiě)onMeasure()方法的話(huà),就只能使用EXACTLY模式??丶梢皂憫?yīng)你指定的具體寬高值或者是match_parent屬性。而如果要讓自定義View支持wrap_content屬性,那么就必須重寫(xiě)onMeasure()方法來(lái)指定wrap_content時(shí)的大小。
ViewGroup會(huì)去管理其子View,其中一個(gè)管理項(xiàng)目就是負(fù)責(zé)子View的顯示大小。當(dāng)ViewGroup的大小為wrap_content時(shí),ViewGroup就需要對(duì)子View進(jìn)行遍歷,以便獲得所有子View的大小,從而來(lái)決定自己的大小。
在自定義ViewGroup時(shí),通常會(huì)去重寫(xiě)onLayout()方法來(lái)控制其子View顯示位置的邏輯。同樣,如果需要支持wrap_content屬性,那么它還必須重寫(xiě)onMeasure()方法,這點(diǎn)與View是相同的。
ViewGroup會(huì)使用dispatchDraw()方法來(lái)繪制其子View,其過(guò)程同樣是通過(guò)遍歷所有子View,并調(diào)用子View的繪制方法來(lái)完成繪制工作。
在View中通常有以下一些比較重要的回調(diào)方法。
onFinishInflate():從XML加載組件后回調(diào)。
onSizeChanged():組件大小改變時(shí)回調(diào)。
onMeasure():回調(diào)該方法來(lái)進(jìn)行測(cè)量。
onLayout():回調(diào)該方法來(lái)確定顯示的位置。
onTouchEvent():監(jiān)聽(tīng)到觸摸事件時(shí)回調(diào)。
通常情況下,有以下三種方法來(lái)實(shí)現(xiàn)自定義的控件。
對(duì)現(xiàn)有控件進(jìn)行拓展
通過(guò)組合來(lái)實(shí)現(xiàn)新的控件
重寫(xiě)View來(lái)實(shí)現(xiàn)全新的控件