一寨典、Android系統(tǒng)架構(gòu)
1.Linux內(nèi)核層
Android系統(tǒng)是基于Linux 2.6內(nèi)核的,這一層為Android設(shè)備的各種硬件提供了底層的驅(qū)動(dòng)房匆, 如顯示驅(qū)動(dòng)耸成、 音頻驅(qū)動(dòng)报亩、 照相機(jī)驅(qū)動(dòng)、 藍(lán)牙驅(qū)動(dòng)井氢、Wi-Fi驅(qū)動(dòng)弦追、 電源管理等。
2.系統(tǒng)運(yùn)行庫(kù)層
這一層通過(guò)一些C/C++庫(kù)來(lái)為Android系統(tǒng)提供了主要的特性支持花竞。 如SQLite庫(kù)提供了數(shù)據(jù)庫(kù)的支持劲件,OpenGL/ES庫(kù)提供了3D繪圖的支持,Webkit庫(kù)提供了瀏覽器內(nèi)核的支持等约急。同樣在這一層還有Android運(yùn)行時(shí)庫(kù)零远, 它主要提供了一些核心庫(kù), 能夠允許開(kāi)發(fā)者使用Java語(yǔ)言來(lái)編寫(xiě)Android應(yīng)用厌蔽。另外Android運(yùn)行時(shí)庫(kù)中還包含了Dalvik虛擬機(jī)牵辣,它使得每一個(gè)Android應(yīng)用都能運(yùn)行在獨(dú)立的進(jìn)程當(dāng)中, 并且擁有一個(gè)自己的Dalvik虛擬機(jī)實(shí)例奴饮。相較于Java虛擬機(jī)纬向,Dalvik是專門(mén)為移動(dòng)設(shè)備定制的,它針對(duì)手機(jī)內(nèi)存戴卜、CPU性能有限等情況做了優(yōu)化處理逾条。
3.應(yīng)用框架層
這一層主要提供了構(gòu)建應(yīng)用程序時(shí)可能用到的各種API,Android自帶的一些核心應(yīng)用就是使用這些API完成的投剥, 開(kāi)發(fā)者也可以通過(guò)使用這些API來(lái)構(gòu)建自己的應(yīng)用程序膳帕。
4.應(yīng)用層
所有安裝在手機(jī)上的應(yīng)用程序都是屬于這一層的, 比如系統(tǒng)自帶的聯(lián)系人薇缅、 短信等程序危彩,或者是你從Google Play上下載的小游戲,當(dāng)然還包括你自己開(kāi)發(fā)的程序泳桦。
二汤徽、Android四大組件
Android系統(tǒng)四大組件分別是活動(dòng)(Activity)、服務(wù)(Service)灸撰、廣播接收器(BroadcastReceiver) 和內(nèi)容提供器(Content Provider)谒府。 其中活動(dòng)是所有Android應(yīng)用程序的門(mén)面,凡是在應(yīng)用中你看得到的東西浮毯, 都是放在活動(dòng)中的完疫。 而服務(wù)就比較低調(diào)了, 你無(wú)法看到它债蓝, 但它會(huì)一直在后臺(tái)默默地運(yùn)行壳鹤, 即使用戶退出了應(yīng)用, 服務(wù)仍然是可以繼續(xù)運(yùn)行的饰迹。廣播接收器可以允許你的應(yīng)用接收來(lái)自各處的廣播消息芳誓, 比如電話余舶、 短信等, 當(dāng)然你的應(yīng)用同樣也可以向外發(fā)出廣播消息锹淌。內(nèi)容提供器則為應(yīng)用程序之間共享數(shù)據(jù)提供了可能匿值,比如你想要讀取系統(tǒng)電話簿中的聯(lián)系人,就需要通過(guò)內(nèi)容提供器來(lái)實(shí)現(xiàn)赂摆。
三挟憔、活動(dòng)(Activity)
Intent:Intent是Android程序中各組件之間進(jìn)行交互的一種重要方式,它不僅可以指明當(dāng)前組件想要執(zhí)行的動(dòng)作烟号,還可以在不同組件之間傳遞數(shù)據(jù)绊谭。Intent一般可被用于啟動(dòng)活動(dòng)、啟動(dòng)服務(wù)褥符、 以及發(fā)送廣播等場(chǎng)景龙誊。
Intent分為顯示Intent與隱式Intent。
四喷楣、活動(dòng)的生命周期
返回棧
五趟大、活動(dòng)狀態(tài)
運(yùn)行狀態(tài):當(dāng)一個(gè)活動(dòng)位于返回棧的棧頂時(shí), 這時(shí)活動(dòng)就處于運(yùn)行狀態(tài)铣焊。 系統(tǒng)最不愿意回收的就是處于運(yùn)行狀態(tài)的活動(dòng)逊朽,因?yàn)檫@會(huì)帶來(lái)非常差的用戶體驗(yàn)。
暫停狀態(tài):當(dāng)一個(gè)活動(dòng)不再處于棧頂位置曲伊, 但仍然可見(jiàn)時(shí)叽讳, 這時(shí)活動(dòng)就進(jìn)入了暫停狀態(tài)。處于暫停狀態(tài)的活動(dòng)仍然是完全存活著的坟募, 系統(tǒng)也不愿意去回收這種活動(dòng)(因?yàn)樗€是可見(jiàn)的岛蚤,回收可見(jiàn)的東西都會(huì)在用戶體驗(yàn)方面有不好的影響),只有在內(nèi)存極低的情況下懈糯,系統(tǒng)才會(huì)去考慮回收這種活動(dòng)涤妒。
停止?fàn)顟B(tài):當(dāng)一個(gè)活動(dòng)不再處于棧頂位置, 并且完全不可見(jiàn)的時(shí)候赚哗, 就進(jìn)入了停止?fàn)顟B(tài)她紫。 系統(tǒng)仍然會(huì)為這種活動(dòng)保存相應(yīng)的狀態(tài)和成員變量, 但是這并不是完全可靠的屿储, 當(dāng)其他地方需要內(nèi)存時(shí)贿讹,處于停止?fàn)顟B(tài)的活動(dòng)有可能會(huì)被系統(tǒng)回收。
銷毀狀態(tài):當(dāng)一個(gè)活動(dòng)從返回棧中移除后就變成了銷毀狀態(tài)够掠。 系統(tǒng)會(huì)最傾向于回收處于這種狀態(tài)的活動(dòng)民褂,從而保證手機(jī)的內(nèi)存充足。
六、活動(dòng)生存周期
七助赞、活動(dòng)啟動(dòng)模式
啟動(dòng)模式一共有四種买羞,分別是standard袁勺、singleTop雹食、singleTask和singleInstance, 可以在AndroidManifest.xml通過(guò)給標(biāo)簽指定android:launchMode屬性來(lái)選擇啟動(dòng)模式期丰。
standard是活動(dòng)默認(rèn)的啟動(dòng)模式群叶,在不進(jìn)行顯式指定的情況下,所有活動(dòng)都會(huì)自動(dòng)使用這種啟動(dòng)模式钝荡。 因此街立, 到目前為止我們寫(xiě)過(guò)的所有活動(dòng)都是使用的standard模式。 在standard模式(即默認(rèn)情況)下埠通,每當(dāng)啟動(dòng)一個(gè)新的活動(dòng)赎离,它就會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢枚巳琛?duì)于使用standard模式的活動(dòng)梁剔,系統(tǒng)不會(huì)在乎這個(gè)活動(dòng)是否已經(jīng)在返回棧中存在,每次啟動(dòng)都會(huì)創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例舞蔽。
當(dāng)活動(dòng)的啟動(dòng)模式指定為singleTop荣病, 在啟動(dòng)活動(dòng)時(shí)如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動(dòng), 則認(rèn)為可以直接使用它渗柿,不會(huì)再創(chuàng)建新的活動(dòng)實(shí)例个盆。
當(dāng)活動(dòng)的啟動(dòng)模式指定為singleTask, 每次啟動(dòng)該活動(dòng)時(shí)系統(tǒng)首先會(huì)在返回棧中檢查是否存在該活動(dòng)的實(shí)例朵栖, 如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實(shí)例颊亮, 并把在這個(gè)活動(dòng)之上的所有活動(dòng)統(tǒng)統(tǒng)出棧,如果沒(méi)有發(fā)現(xiàn)就會(huì)創(chuàng)建一個(gè)新的活動(dòng)實(shí)例陨溅。
singleInstance在這種模式下會(huì)有一個(gè)單獨(dú)的返回棧來(lái)管理這個(gè)活動(dòng)终惑, 不管是哪個(gè)應(yīng)用程序來(lái)訪問(wèn)這個(gè)活動(dòng), 都共用的同一個(gè)返回棧声登, 也就解決了共享活動(dòng)實(shí)例的問(wèn)題狠鸳。