日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

前言

本文本來是自己復(fù)盤 Android 知識(shí)梳理用的,沒想到在上周部門內(nèi)部的知識(shí)測(cè)評(píng)中發(fā)現(xiàn),同事們對(duì)這些基礎(chǔ)知識(shí)的掌握參差不齊,甚至可以說是模棱兩可。

 

是網(wǎng)上關(guān)于 Activity 的教程太少了嗎?不是的,恰恰相反,網(wǎng)上的信息多如牛毛,卻沒有一篇愿意費(fèi)哪怕一絲絲的筆墨 來介紹 Activity 的起源、它的職責(zé)邊界、它的存在到底是為了解決什么問題、我們學(xué)習(xí)它,到底學(xué)到什么程度才算掌握。

正因?yàn)閷?duì)這些最基本而必要的概念模棱兩可,使得教程再多、再優(yōu)秀,也沒多少人能消化、能記住。于是我抱著試試看的心態(tài),在經(jīng)過幾番潤(rùn)色過,將自己復(fù)盤的結(jié)果,在小會(huì)上分享出來供同事們享用。想不到原本不屑聽的幾個(gè)同事,在聽完這番講解后,連說真香。

所以如果你因?yàn)楸疚模鴮?duì) Activity 乃至向上追溯的 View、Window、WindowManager、WindowManagerService、Surface、Surface Flinger 各自的起源、職責(zé)邊界以及相互間的關(guān)系有了最基本的感性認(rèn)識(shí),繼而不知不覺地開始有了一絲絲好奇,推動(dòng)你深入地去探究,那我的愿望也就達(dá)到了。

Android程序員如何快樂地學(xué)Activity?

 

我是一塊板磚

我是一塊運(yùn)行著原始 Android 系統(tǒng)的板磚。我有一塊屏幕,人們只要通過硬件抽象層(HAL)的代碼對(duì)屏幕發(fā)起指令,屏幕上就可以顯示人們想看到的內(nèi)容。然而這么做過于原始,也不契合板磚的使用場(chǎng)景。

于是有人考慮在 HAL 之上的運(yùn)行時(shí)層(ART)用 C++ 封裝一個(gè)服務(wù),該服務(wù)的名稱就叫 Surface Flinger。

我是 Surface Flinger

我是 Surface Flinger,我的職責(zé)是專門負(fù)責(zé) UI 內(nèi)容的渲染。

人們想要在屏幕上渲染出什么內(nèi)容,都可以通過我來間接地與屏幕打交道。這就好比你在電腦上排版好的文檔,只需通過打印機(jī)驅(qū)動(dòng)程序這個(gè)中介,就能幫助你將文檔內(nèi)容輸出到紙上。

至于內(nèi)容本身究竟有些什么,這我不管,我只負(fù)責(zé)統(tǒng)一地、有序地將內(nèi)容安排成輸出設(shè)備能理解的方式,來實(shí)現(xiàn)輸出。

我是 Window

這塊板磚的主人不僅想要渲染 UI,還想要窗口,于是在應(yīng)用框架層,通過 JAVA 封裝了我。

人如其名,我就是一個(gè)窗口,我負(fù)責(zé)可視化內(nèi)容的排版,然后將排版結(jié)果,通過我的上司 WindowManager,通過進(jìn)程通信的方式,去與后臺(tái)服務(wù) WindowManagerService 通信,最終遞交到 Surface Flinger 來輸出和呈現(xiàn)。

Surface Flinger 為我們每一個(gè) Window 都映射了一塊 Surface,來用于管理和渲染屏幕內(nèi)容。

然而作為一個(gè) Window,我也有我的苦衷。

我是一個(gè)會(huì)套娃的 View

主人因?yàn)榻?jīng)常聽 Window 大哥抱怨排版的負(fù)擔(dān)太重,于是用組合模式封裝了我。我的 “有容乃大” 版本:ViewGroup,因?yàn)榻M合模式,而能夠在自身內(nèi)部存在更多的 View 或 ViewGroup,這使得我們從結(jié)構(gòu)上來看,就像套娃。

托遞歸的福,我們的排版工作:Measure、Layout、Draw,可以自己通過如此般的遞歸,自下往上地完成。然后 Window 大哥就可以直接拿著我們的排版結(jié)果,去向上司交差啦。

…… 所以,Window 成了摸魚般的存在嗎?

本來 Window 正尋思著,日子過得這般清閑自在,沒想到好日子到頭 —— 主人不僅要一個(gè)窗口,還想要多窗口。這多窗口它就涉及到窗口間的切換、通信等等,甚是麻煩,這些臟活累活要是交給以后的開發(fā)者來干,那我不得留下一世罵名、遺臭萬(wàn)年??!

想到這里我就感覺哆嗦,不行,為了我一世英名,我得向主人進(jìn)言。

其實(shí)早在 20000 多年前,女媧造人的時(shí)候,便采用了神級(jí)的模板方法模式,將一系列的通用功能都封裝好,只暴露一些 DNA 接口,以供后來者隨機(jī)輸入和演變。

換言之,主人只需以模板方法模式的方式將我重新封裝,并且編寫一套管理窗口的任務(wù)和返回棧機(jī)制在背地里運(yùn)籌帷幄,那么未來的開發(fā)者就只需繼承我,而得到一個(gè)簡(jiǎn)練的配置模板,從而在模板上面輸入他們的定制內(nèi)容,以得到他們想要的結(jié)果。

于是我改名叫 Activity

Window 成了我永恒不變的信仰,存留在我的體內(nèi)。對(duì)于開發(fā)者來說,我就是個(gè)待繼承的 Activity,開發(fā)者通過繼承我,拿到的就是一個(gè)個(gè)簡(jiǎn)練的模板。

對(duì)系統(tǒng)來說,我的本質(zhì)仍是被管理的窗口,系統(tǒng)能夠管理我和其他窗口的切換和通信。

對(duì)開發(fā)者來說,我的本質(zhì)是視圖控制器,開發(fā)者通過我可以控制 View 以他們想要的方式進(jìn)行排版,并且在特殊狀況下保存和恢復(fù) View 的排版內(nèi)容。

綜上

最開始只有一塊運(yùn)行著原始 Android 系統(tǒng)的板磚。

  • Surface Flinger 的出現(xiàn)是為了更加方便地完成 UI 渲染。
  • Window 的出現(xiàn)是為了管理 UI 內(nèi)容的排版。
  • Window 不堪重負(fù)于是將責(zé)任下發(fā)到 View 身上。
  • View 通過組合模式,在遞歸的幫助下蹭蹭蹭地完成排版工作。
  • Activity 的出現(xiàn)是為了滿足多窗口管理和傻瓜式視圖管理的需要。
  • 所以 Activity 的知識(shí)邊界無(wú)非就是生命周期、特殊狀況導(dǎo)致的重建、多窗口跳轉(zhuǎn)(啟動(dòng)模式、intent)、視圖的加載和優(yōu)化等等。

這樣說,你理解了嗎?

分享到:
標(biāo)簽:Android Activity
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定