本文由做者 KunMinX 原創,已受權某公衆號獨家轉載 🔥框架
本文原本是本身覆盤 Android 知識梳理用的,沒想到在上週部門內部的知識測評中發現,同事們對這些基礎知識的掌握良莠不齊,甚至能夠說是模棱兩可。學習
是網上關於 Activity 的教程太少了嗎?不是的,偏偏相反,網上的信息多如牛毛,卻沒有一篇願意費哪怕一絲絲的筆墨 來介紹 Activity 的起源、它的職責邊界、它的存在究竟是爲了解決什麼問題、咱們學習它,到底學到什麼程度纔算掌握。優化
正由於對這些最基本而必要的概念模棱兩可,使得教程再多、再優秀,也沒多少人能消化、能記住。因而我抱着試試看的心態,在通過幾番潤色過,將本身覆盤的結果,在小會上分享出來供同事們享用。想不到本來不屑聽的幾個同事,在聽完這番講解後,連說真香。3d
因此若是你由於本文,而對 Activity
乃至向上追溯的 View
、Window
、WindowManager
、WindowManagerService
、Surface
、Surface Flinger
各自的起源、職責邊界以及相互間的關係有了最基本的感性認識,繼而不知不覺地開始有了一絲絲好奇,推進你深刻地去探究,那個人願望也就達到了。code
我是一塊運行着原始 Android 系統的板磚。我有一塊屏幕,人們只要經過硬件抽象層(HAL)的代碼對屏幕發起指令,屏幕上就能夠顯示人們想看到的內容。然而這麼作過於原始,也不契合板磚的使用場景。cdn
因而有人考慮在 HAL 之上的運行時層(ART)用 C++ 封裝一個服務,該服務的名稱就叫 Surface Flinger。blog
我是 Surface Flinger,個人職責是專門負責 UI 內容的渲染。繼承
人們想要在屏幕上渲染出什麼內容,均可以經過我來間接地與屏幕打交道。這就比如你在電腦上排版好的文檔,只需經過打印機驅動程序這個中介,就能幫助你將文檔內容輸出到紙上。教程
至於內容自己究竟有些什麼,這我無論,我只負責統一地、有序地將內容安排成輸出設備能理解的方式,來實現輸出。遞歸
這塊板磚的主人不只想要渲染 UI,還想要窗口,因而在應用框架層,經過 Java 封裝了我。
人如其名,我就是一個窗口,我負責可視化內容的排版,而後將排版結果,經過個人上司 WindowManager,經過進程通訊的方式,去與後臺服務 WindowManagerService 通訊,最終遞交到 Surface Flinger 來輸出和呈現。
Surface Flinger 爲咱們每個 Window 都映射了一塊 Surface,來用於管理和渲染屏幕內容。
然而做爲一個 Window,我也有個人苦衷。
主人由於常常聽 Window 大哥抱怨排版的負擔過重,因而用組合模式封裝了我。個人 「有容乃大」 版本:ViewGroup,由於組合模式,而可以在自身內部存在更多的 View 或 ViewGroup,這使得咱們從結構上來看,就像套娃。
託遞歸的福,咱們的排版工做:Measure、Layout、Draw,能夠本身經過如此般的遞歸,自下往上地完成。而後 Window 大哥就能夠直接拿着咱們的排版結果,去向上司交差啦。
原本 Window 正尋思着,日子過得這般悠閒自在,沒想到好日子到頭 —— 主人不只要一個窗口,還想要多窗口。這多窗口它就涉及到窗口間的切換、通訊等等,甚是麻煩,這些髒活累活要是交給之後的開發者來幹,那我不得留下一世罵名、遺臭萬年??!
想到這裏我就感受哆嗦,不行,爲了我一世英名,我得向主人進言。
其實早在 20000 多年前,女媧造人的時候,便採用了神級的模板方法模式,將一系列的通用功能都封裝好,只暴露一些 DNA 接口,以供後來者隨機輸入和演變。
換言之,主人只需以模板方法模式的方式將我從新封裝,而且編寫一套管理窗口的任務和返回棧機制在背地裏指揮若定,那麼將來的開發者就只需繼承我,而獲得一個簡練的配置模板,從而在模板上面輸入他們的定製內容,以獲得他們想要的結果。
Window 成了我永恆不變的信仰,存留在個人體內。對於開發者來講,我就是個待繼承的 Activity,開發者經過繼承我,拿到的就是一個個簡練的模板。
對系統來講,個人本質還是被管理的窗口,系統可以管理我和其餘窗口的切換和通訊。
對開發者來講,個人本質是視圖控制器,開發者經過我能夠控制 View 以他們想要的方式進行排版,而且在特殊情況下保存和恢復 View 的排版內容。
最開始只有一塊運行着原始 Android 系統的板磚。
Surface Flinger 的出現是爲了更加方便地完成 UI 渲染。
Window 的出現是爲了管理 UI 內容的排版。
Window 不堪重負因而將責任下發到 View 身上。
View 經過組合模式,在遞歸的幫助下蹭蹭蹭地完成排版工做。
Activity 的出現是爲了知足多窗口管理和傻瓜式視圖管理的須要。
因此 Activity 的知識邊界無非就是生命週期、特殊情況致使的重建、多窗口跳轉(啓動模式、intent)、視圖的加載和優化等等。
這樣說,你理解了嗎?
看不過癮?這裏只爲你 而準備了一份 簡潔有力的 《重學安卓》認知地圖 😉