小編給大家分享一下UI繪制流程是怎么樣的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計、蒙山網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。在android當(dāng)中對于UI體系當(dāng)中往往我們會在繪制UI的時候碰到各種各樣的問題而不知道從何解決, 也有時需要開發(fā)更改自定義組件時,需要做自己的調(diào)整,或者是實現(xiàn)某個自定義特效時的思路不明確,想要達(dá)到去玩轉(zhuǎn)UI的最為基礎(chǔ)的部分,就是去全面的深入了解UI的繪制流程.所以接下來帶大家去進(jìn)行全面分析UI整體的繪制體系.
思路:android程序啟動-→Activity加載并完成生命周期-→setContentView-→圖形繪制
1.Android程序是如何啟動,Activity生命周期如何調(diào)用?
2.在Activity onCreate當(dāng)中我們的setContentView是如何將UI文件加載?
答案:
眾所周知,我們的java程序想要開啟需要依賴于main方法,也就是我們的程序入口(主線程)進(jìn)入,但是在我們?nèi)粘i_發(fā)android程序的過程當(dāng)中我們并沒有發(fā)現(xiàn)main方法的存在,那么android當(dāng)中的是如何開始運行的?
熟悉的朋友們可能都知道在android當(dāng)中存在一個叫做ActivityThread的類,這個類代表的是android當(dāng)中的主線程,而在這個類當(dāng)中我們看到了比較熟悉的main方法,那么現(xiàn)在是否可以認(rèn)為我們的android在打開app時是首先調(diào)用的是當(dāng)前這個類的main,也就是此處為我們的啟動點
在此處可以看到Activity調(diào)用了一個attach()方法
在這里我們可能首先要考慮的是getService拿出來的是什么?
進(jìn)去之后,我們會發(fā)現(xiàn)
在這個當(dāng)中,里面調(diào)用了的系統(tǒng)的ActivityManagerService這個服務(wù),并且給出了一個Binder接口
那么在這里,我們可以聯(lián)想到,在android當(dāng)中的binder通信機(jī)制,那么實際上我們的ActivityManager是有系統(tǒng)服務(wù)所調(diào)用管理,并且通過在binder接口當(dāng)中進(jìn)行調(diào)用,這也是為什么我們講Activity是跨進(jìn)程訪問的原因
那么明白了這個時候能夠得到ActivityManager之后,我們接著回到attach當(dāng)中繼續(xù)看下去, 這個時候會發(fā)現(xiàn),我們調(diào)用了一個attachApplication方法(見圖2)這個方法又是干嘛的?attachApplication在這里的作用其實實際上是ActivityThread通過attach獲取到,然后將applciationThread將其關(guān)聯(lián),把a(bǔ)ctivity相關(guān)信息存儲在applciationThread里面,apllicationThread的類為activity的各種狀態(tài)做了相對應(yīng)的準(zhǔn)備工作
這個時候我們需要關(guān)注,ApplicationThread當(dāng)中做了什么?
當(dāng)我們打開ApplicationThread中我們會看到一堆的schedle方法,這些方法的名稱其實就可以給我們表明,代表的是在執(zhí)行Activity的某種狀態(tài)時調(diào)用的計劃執(zhí)行方法
這時我們會看到一個scheduleLaunchActivity方法,表示計劃加載時調(diào)用的
這里我發(fā)現(xiàn)了一個很有意思的事情
這個上面我們會看到一個ActivityClientRecord對象,這個對象其實實際上就是我們的Activity
而且似乎每一個方法還干了一件讓我們非常熟悉的一件事, 進(jìn)行了一次sendMessage()將當(dāng)前創(chuàng)建的Activity發(fā)送了出去
當(dāng)走到這里我們會發(fā)現(xiàn)最終我們調(diào)用的是Handler的消息通信機(jī)制,也就是說,在這里我們可以總結(jié)一下,
當(dāng)Activity狀態(tài)改變時,都會有對應(yīng)的一個消息發(fā)送出去
而接收這里,我能發(fā)現(xiàn)通過發(fā)送時不同的狀態(tài),這邊調(diào)用了不同的handlerXXXActivity方法
在這里,我門貌似發(fā)現(xiàn)了Activity的生命周期的調(diào)用痕跡,那么其實到此為止,我門可以得出一個結(jié)論,
Application運行的過程當(dāng)中,對于Activity的操作,狀態(tài)轉(zhuǎn)變,其實實際上是通過Handler消息機(jī)制來完成的,
Application當(dāng)中只管去發(fā), 由消息機(jī)制負(fù)責(zé)調(diào)用,因為在main方法當(dāng)中我門的Looper輪訓(xùn)器是一直在進(jìn)行輪訓(xùn)的
而當(dāng)我們在加載Activity的時候,當(dāng)中調(diào)用了一個performLaunchActivity()方法,在這個中間我發(fā)現(xiàn)了我們onCreate的調(diào)用痕跡
也就是說,到目前為止我們能夠明白,整個Application加載Activity的整套流程是怎么回事
那么接下來我們需要關(guān)注的是,在onCreate當(dāng)中我們所寫的setContentView到底干了什么
在onCreate當(dāng)中我們往往會使用setContentView去進(jìn)行設(shè)置我們自己的布局文件或者view,那么在這當(dāng)中他到底是怎么做的?通過觀察源碼,這個時候通過一系列線索我找到了最終的位置PhoneWindow類
這個時候我們會看到他做了兩個事情,一個是installDecor,另一個是inflate,這兩個后一個不難猜出他是在進(jìn)行布局文件的解析, 前面的我們認(rèn)為她是在初始化某個東西
進(jìn)來之后發(fā)現(xiàn)他初始化了兩個東西,一個叫做mDecor,一個叫做mContentParent
我們看到了mDecor是一個DecorView
mContentParent是一個ViewGroup
透過注釋的翻譯,其實我們就能很明確知道這兩個是用來干嘛的
// This is the view in which the window contents are placed. It is either(這是放置窗口內(nèi)容的視圖)
// mDecor itself, or a child of mDecor where the contents go.(它要么是mDecor本身,要么是mDecor的子類的內(nèi)容。)
//This is the top-level view of the window, containing the window decor.(這是在窗口當(dāng)中的頂層View,包含窗口的decor)
一個代表的是頂層view,一個用來裝他下面的視圖內(nèi)容
在接著往下看的時候,我門發(fā)現(xiàn),generateLayout方法當(dāng)中,發(fā)現(xiàn)了在此處進(jìn)行了大量的requestFeature的調(diào)用,也就是所,我們的requestFeature
然后在下面我門會發(fā)現(xiàn)在做了一件事情,
當(dāng)前這里竟然在加載布局文件,并且生成了一個view, 但是好像貌似不是我門自己的
所以我們需要去探尋他到底加載了一個什么東東?
這是我找到了一個比較有意思的組件,
在這個上面我看到了一句這樣的注釋
//This is an optimized layout for a screen, with the minimum set of features
enabled.
這是一個屏幕的優(yōu)化布局,具有最小的特征集啟用。
通過注釋和一些資料分析, 得到了一個比較坑的結(jié)果。
這是DecorView默認(rèn)的一個渲染,然后我門自己的布局都是渲染到她的FrameLayout上的
那么在這里我門現(xiàn)在能夠明白,installDector其實實際上是在初始化兩個視圖容器,然后加載系統(tǒng)的R資源及特征,產(chǎn)生了一個基本布局
那么接著回到之前我門關(guān)注的另外一個方法mLayoutInflater.inflate(layoutResID, mContentParent);
這個方法就比較好理解了,
這這段注釋上面我門就可以得到一個信息
//Inflate a new view hierarchy from the specified xml resource.(從指定的視圖當(dāng)中獲取試圖的層次結(jié)構(gòu),意思就是,現(xiàn)在在加載自己的資源)
而具體流程就不貼代碼了給各位上一張圖
那么在這里我門就能夠明白,setContentView其實做了兩件比較核心的事情,就是加載環(huán)境配置,和自己的布局,那么接下來我門需要考慮的事情就是,他到底怎么畫到界面上的
通過前面兩個章節(jié),我門了解到,程序?qū)τ赼ctivity生命周期的調(diào)用,以及我們的視圖資源的由來。這是我門需要找到的是我門的繪制起點在哪?
在ActivityThread啟動時, 我發(fā)現(xiàn)在加載handleLaunchActivity方法調(diào)用performLaunchActivity方法之后又調(diào)用了一個handleResumeActivity在這里我發(fā)現(xiàn)了繪制流程的開始
通過前面的流程我門知道,onCreate之行完成之后,所有資源交給WindowManager保管
在這里,將我們的VIew交給了WindowManager,此處調(diào)用了addView
進(jìn)入addView之后我們發(fā)現(xiàn)了一段這樣的代碼,他將視圖,和參數(shù)還有我門的一個ViewRoot對象都用了容器去裝在了起來,那么在此處我門可以得出,是將所有的相關(guān)對象保存起來
mViews保存的是View對象,DecorView
mRoots保存和頂層View關(guān)聯(lián)的ViewRootImpl對象
mParams保存的是創(chuàng)建頂層View的layout參數(shù)。
而WindowManagerGlobal類也負(fù)責(zé)和WMS通信
而在此時,有一句關(guān)鍵代碼root.setView,這里是將我們的參數(shù),和視圖同時交給了ViewRoot,那么這個時候我們來看下ViewRoot當(dāng)中的setView干了什么
終于在這里讓我發(fā)現(xiàn)了讓我明白的一步
在這里我門會看到view.assignParent的設(shè)置是this, 那么也就是說在view當(dāng)中parent其實實際上是ViewRoot
那么在setContentView當(dāng)中調(diào)用了一個setLayoutParams()是調(diào)用的ViewRoot的
而在ViewRoot當(dāng)中發(fā)現(xiàn)了setLayoutParams和preformLayout對requestLayout方法的調(diào)用
在requestLayout當(dāng)中發(fā)現(xiàn)了對scheduleTraversals方法的調(diào)用而scheduleTraversals當(dāng)中調(diào)用了doTraversal的訪問,最終訪問到了performTraversals(),而在這個里面,我發(fā)現(xiàn)了整體的繪制流程的調(diào)用
當(dāng)前里面依次是用了
UI繪制先回去測量布局,然后在進(jìn)行布局的擺放,當(dāng)所有的布局測量擺放完畢之后,進(jìn)行繪制。
以上是“UI繪制流程是怎么樣的”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:UI繪制流程是怎么樣的-創(chuàng)新互聯(lián)
URL標(biāo)題:http://jinyejixie.com/article24/csdsce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站設(shè)計、面包屑導(dǎo)航、全網(wǎng)營銷推廣、企業(yè)建站、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)