Android平臺架構(gòu)及特性

1.概述

Android系統(tǒng)的底層建立在Linux系統(tǒng)之上,采用軟件疊層(software stack,使得層與層之間相互分離)的方式進(jìn)行構(gòu)建解寝。其本質(zhì)就是在標(biāo)準(zhǔn)的linux系統(tǒng)上增加了Java虛擬機(jī)Dalvik,并在Dalvik虛擬機(jī)上搭建了一個Javaapplication framework,所有的應(yīng)用程序都是基于Java的application framework之上酸钦。

2.Android系統(tǒng)的體系結(jié)構(gòu)

android運(yùn)行時由兩部分組成:Android核心庫集和Dalvik虛擬機(jī)。其中核心庫集提供了Java語言核心庫所能使用的絕大部分功能咱枉,而虛擬機(jī)則負(fù)責(zé)運(yùn)行Android應(yīng)用程序卑硫。每個Android應(yīng)用程序都運(yùn)行在單獨的Dalvik虛擬機(jī)內(nèi)。

3.activity生命周期流程圖

onCreate(Bundle savedInstanceState):創(chuàng)建activity時調(diào)用蚕断,還以Bundle的形式提供對以前存儲的任何狀態(tài)的訪問欢伏。

onStart():activity變?yōu)樵谄聊簧蠈τ脩艨梢姇r調(diào)用。

onResume():activity開始與用戶交互時調(diào)用亿乳。

onPause():activity被暫拖跖。或收回CPU和其他資源時調(diào)用,該方法用于保存活動狀態(tài)的葛假。

onStop():activity被停止并轉(zhuǎn)為不可見階段及后續(xù)的生命周期事件時調(diào)用障陶。

onRestart():重新啟動activity時被調(diào)用。該活動仍在棧中桐款,而不是啟動新的活動咸这。

onDestroy():activity被完全從系統(tǒng)內(nèi)存中移除時調(diào)用。

4.android與ios運(yùn)行機(jī)制上有哪些不同魔眨?

(1)iOS是“偽后臺”媳维,所謂的“后臺駐留”并不是指“執(zhí)行中的程序”酿雪,而是“最近使用過的程序”。如果你一個一個去清楚“后臺駐留”的程序侄刽,就像是一筆一筆刪除瀏覽記錄中的項目一樣指黎,是沒有太大意義的。一般來說州丹,在你按下Home鍵后醋安,本來的程式就會退到背景,如果它有額外的背景執(zhí)行作業(yè)墓毒,超過10分鐘還是會被ios中止吓揪。ios只給一部分進(jìn)程留有后臺運(yùn)行權(quán)限,比如音樂播放之類的所计。蘋果一直只能有一個程序在工作柠辞,其他的都會停掉,所以非常流暢(其他特殊的進(jìn)程在后臺跑的)主胧。雖然說程序被停了叭首,但是,程序并沒有在內(nèi)存中釋放踪栋,而是繼續(xù)放在內(nèi)存中焙格,這樣帶來的好處就是你再次打開程序的時候,會回復(fù)到你之前關(guān)閉程序的界面夷都,程序快速的繼續(xù)運(yùn)行眷唉。那么,當(dāng)內(nèi)存中程序太多了损肛,內(nèi)存不夠的時候怎么辦厢破?當(dāng)內(nèi)存不足的時候,iOS會依據(jù)自身判斷出程序的優(yōu)先級治拿,之后清理程序占用的內(nèi)存摩泪。比如音樂,應(yīng)該就屬于是優(yōu)先級比較高的程序劫谅。iOS根據(jù)優(yōu)先級见坑,和使用次數(shù)來決定哪些程序首先清出后臺。不只是簡單的看時間捏检。將程序踢出內(nèi)存荞驴,就是所謂的掛起。從而釋放內(nèi)存贯城,供新打開的程序使用熊楼。當(dāng)然,以前一直被蘋果用戶給詬病的就是QQ不能掛后臺能犯,一按Home鍵就掉線就是這個原因(當(dāng)然鲫骗,蘋果通過推送來解決這個問題)犬耻。

android有前臺運(yùn)行和后臺運(yùn)行之說,當(dāng)你把一個程序放到后臺执泰,他是活動的枕磁,跟在前臺沒有區(qū)別。而且還有些系統(tǒng)的服務(wù)一直在運(yùn)行术吝。android大多應(yīng)用沒有退出的設(shè)計其實是有道理的计济,這和系統(tǒng)對進(jìn)程的調(diào)度機(jī)制有關(guān)系。如果你知道java排苍,就能更清楚這機(jī)制了沦寂。其實和java的垃圾回收機(jī)制類似,系統(tǒng)有一個規(guī)則來回收內(nèi)存淘衙。進(jìn)行內(nèi)存調(diào)度有個閥值凑队,只有低于這個值系統(tǒng)才會按一個列表來關(guān)閉用戶不需要的東西。當(dāng)然這個值默認(rèn)設(shè)置得很小幔翰,所以你會看到內(nèi)存老在很少的數(shù)值徘徊。但事實上他并不影響速度西壮。相反加快了下次啟動應(yīng)用的速度遗增。這本來就是android標(biāo)榜的優(yōu)勢之一,如果人為去關(guān)閉進(jìn)程款青,沒有太大必要做修。特別是自動關(guān)進(jìn)程的軟件。 到這里有人會說了抡草,那為什么內(nèi)存少的時候運(yùn)行大型程序會慢呢饰及?其實很簡單,在內(nèi)存剩余不多時打開大型程序康震,會觸發(fā)系統(tǒng)自身的調(diào)進(jìn)程調(diào)度策略燎含,這是十分消耗系統(tǒng)資源的操作,特別是在一個程序頻繁向系統(tǒng)申請內(nèi)存的時候腿短。這種情況下系統(tǒng)并不會關(guān)閉所有打開的進(jìn)程屏箍,而是選擇性關(guān)閉,頻繁的調(diào)度自然會拖慢系統(tǒng)橘忱。所以赴魁,論壇上有個更改內(nèi)存閥值的程序可以有一定改善。 但改動也可能帶來一些問題钝诚,取決于值的設(shè)定颖御。 那么,進(jìn)程管理軟件有無必要呢凝颇?有的潘拱。就是在運(yùn)行大型程序之前疹鳄,你可以手動關(guān)閉一些進(jìn)程釋放內(nèi)存,可以顯著的提高運(yùn)行速度泽铛。但一些小程序尚辑,完全可交由系統(tǒng)自己管理。談到這里盔腔,可能有的朋友會問杠茬,如果不關(guān)程序是不是會更耗電。我就說說 android后臺的原理弛随,你就明白了瓢喉。android的應(yīng)用在被切換到后臺時,它其實已經(jīng)被暫停了舀透,并不會消耗cpu資源栓票,只保留了運(yùn)行狀態(tài)。所以為什么有的程序切出去重進(jìn)會到主界面愕够。但是走贪,一個程序如果想要在后臺處理些東西,如音樂播放惑芭,它就會開啟一個服務(wù)坠狡。服務(wù)可在后臺持續(xù)運(yùn)行,所以在后臺耗電的也只有帶服務(wù)的應(yīng)用了遂跟。這個在進(jìn)程管理軟件里能看到逃沿,標(biāo)簽是service。至于廣播什么的我就不涉及了幻锁。所以沒有帶服務(wù)的應(yīng)用在后臺是完全不耗電的凯亮,沒有必要關(guān)閉。這種設(shè)計本來就是一個非常好的設(shè)計哄尔,下次啟動程序時假消,會更快,因為不需要讀取界面資源究飞,何必要關(guān)掉他們抹殺這個android的優(yōu)點呢置谦? 還有一個。為什么android一個應(yīng)用看起來那么耗內(nèi)存亿傅。大家知道媒峡,android上的應(yīng)用是java,當(dāng)然需要虛擬機(jī)葵擎,而android上的應(yīng)用是帶有獨立虛擬機(jī)的谅阿,也就是每開一個應(yīng)用就會打開一個獨立的虛擬機(jī)。這樣設(shè)計的原因是可以避免虛擬機(jī)崩潰導(dǎo)致整個系統(tǒng)崩潰,但代價就是需要更多內(nèi)存签餐。 以上這些設(shè)計確保了android的穩(wěn)定性寓涨,正常情況下最多單個程序崩潰,但整個系統(tǒng)不會崩潰氯檐,也永遠(yuǎn)沒有內(nèi)存不足的提示出現(xiàn)戒良。大家可能是被windows毒害得太深了,總想保留更多的內(nèi)存冠摄,但實際上這并不一定會提升速度糯崎,相反卻喪失了程序啟動快的這一系統(tǒng)特色,很沒必要河泳。大家不妨按我說的習(xí)慣來用用這個系統(tǒng)沃呢。

總結(jié)

①后臺程序的運(yùn)行狀態(tài)

IOS:分三類應(yīng)用,大部分應(yīng)用切換到后臺會停止運(yùn)行拆挥,部分應(yīng)用(音樂薄霜、voip)在任務(wù)完成后也會停止,后臺應(yīng)用不耗cpu纸兔,但應(yīng)用內(nèi)存保持占用狀態(tài)

Android:切換后臺后應(yīng)用進(jìn)入onstop()狀態(tài)惰瓜,不是真正停止,這種狀態(tài)下也不消耗cpu汉矿,部分Android應(yīng)用自帶后臺服務(wù)鸵熟,后臺服務(wù)不會停止,需要消耗CPU负甸,應(yīng)用內(nèi)存都會保持占用狀態(tài)

②后臺應(yīng)用內(nèi)存管理

IOS:后臺應(yīng)用內(nèi)存保持,在新開啟應(yīng)用申請內(nèi)存時會有一套完善機(jī)制(重要性痹届、打開次數(shù)等)確定回收哪些應(yīng)用的內(nèi)存呻待,并為新開啟的應(yīng)用分配足夠的內(nèi)存;

Android:設(shè)置內(nèi)存閥值队腐,只有低于這個值系統(tǒng)才會按一個列表來關(guān)閉用戶不需要的東西蚕捉,在內(nèi)存剩余不多時打開大型程序,會觸發(fā)系統(tǒng)自身的調(diào)進(jìn)程調(diào)度策略十分消耗系統(tǒng)資源柴淘;每一個android都運(yùn)行在一個虛擬機(jī)中迫淹,所以更耗內(nèi)存

5.android四大組件

Android四大組件分別為activity、service为严、content provider敛熬、broadcast receiver。

5.1 activity

(1)一個Activity通常就是一個單獨的屏幕(窗口)第股。

(2)Activity之間通過Intent進(jìn)行通信应民。

(3)android應(yīng)用中每一個Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統(tǒng)將不識別也不執(zhí)行該Activity。

5.2 service

(1)service用于在后臺完成用戶指定的操作诲锹。service分為兩種:

(a)started(啟動):當(dāng)應(yīng)用程序組件(如activity)調(diào)用startService()方法啟動服務(wù)時繁仁,服務(wù)處于started狀態(tài)。

(b)bound(綁定):當(dāng)應(yīng)用程序組件調(diào)用bindService()方法綁定到服務(wù)時归园,服務(wù)處于bound狀態(tài)黄虱。

(2)startService()與bindService()區(qū)別:

(a)started service(啟動服務(wù))是由其他組件調(diào)用startService()方法啟動的,這導(dǎo)致服務(wù)的onStartCommand()方法被調(diào)用庸诱。當(dāng)服務(wù)是started狀態(tài)時捻浦,其生命周期與啟動它的組件無關(guān)对粪,并且可以在后臺無限期運(yùn)行座韵,即使啟動服務(wù)的組件已經(jīng)被銷毀鹉梨。因此符糊,服務(wù)需要在完成任務(wù)后調(diào)用stopSelf()方法停止谊却,或者由其他組件調(diào)用stopService()方法停止倦零。

(b)使用bindService()方法啟用服務(wù)漱办,調(diào)用者與服務(wù)綁定在了一起茵烈,調(diào)用者一旦退出形导,服務(wù)也就終止环疼,大有“不求同時生,必須同時死”的特點朵耕。

(3)開發(fā)人員需要在應(yīng)用程序配置文件中聲明全部的service炫隶,使用標(biāo)簽。

(4)Service通常位于后臺運(yùn)行阎曹,它一般不需要與用戶交互伪阶,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類处嫌。Service組件通常用于為其他組件提供后臺服務(wù)或監(jiān)控其他組件的運(yùn)行狀態(tài)栅贴。

5.3 content provider

(1)android平臺提供了Content Provider使一個應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。其他應(yīng)用可以通過ContentResolver類從該內(nèi)容提供者中獲取或存入數(shù)據(jù)熏迹。

(2)只有需要在多個應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者檐薯。例如,通訊錄數(shù)據(jù)被多個應(yīng)用程序使用注暗,且必須存儲在一個內(nèi)容提供者中坛缕。它的好處是統(tǒng)一數(shù)據(jù)訪問方式。

(3)ContentProvider實現(xiàn)數(shù)據(jù)共享捆昏。ContentProvider用于保存和獲取數(shù)據(jù)赚楚,并使其對所有應(yīng)用程序可見。這是不同應(yīng)用程序間共享數(shù)據(jù)的唯一方式骗卜,因為android沒有提供所有應(yīng)用共同訪問的公共存儲區(qū)直晨。

(4)開發(fā)人員不會直接使用ContentProvider類的對象搀军,大多數(shù)是通過ContentResolver對象實現(xiàn)對ContentProvider的操作。

(5)ContentProvider使用URI來唯一標(biāo)識其數(shù)據(jù)集勇皇,這里的URI以content://作為前綴罩句,表示該數(shù)據(jù)由ContentProvider來管理。

5.4 broadcast receiver

(1)你的應(yīng)用可以使用它對外部事件進(jìn)行過濾敛摘,只對感興趣的外部事件(如當(dāng)電話呼入時门烂,或者數(shù)據(jù)網(wǎng)絡(luò)可用時)進(jìn)行接收并做出響應(yīng)。廣播接收器沒有用戶界面兄淫。然而屯远,它們可以啟動一個activity或serice來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶捕虽。通知可以用很多種方式來吸引用戶的注意力慨丐,例如閃動背燈、震動泄私、播放聲音等房揭。一般來說是在狀態(tài)欄上放一個持久的圖標(biāo),用戶可以打開它并獲取消息晌端。

(2)廣播接收者的注冊有兩種方法捅暴,分別是程序動態(tài)注冊和AndroidManifest文件中進(jìn)行靜態(tài)注冊。

(3)動態(tài)注冊廣播接收器特點是當(dāng)用來注冊的Activity關(guān)掉后咧纠,廣播也就失效了蓬痒。靜態(tài)注冊無需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開啟狀態(tài)漆羔,廣播接收器也是打開著的梧奢。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發(fā)時也會對它起作用演痒。

5.4 android四大組件總結(jié):

(1)4大組件的注冊

4大基本組件都需要注冊才能使用粹断,每個Activity、service嫡霞、Content Provider都需要在AndroidManifest文件中進(jìn)行配置。AndroidManifest文件中未進(jìn)行聲明的activity希柿、服務(wù)以及內(nèi)容提供者將不為系統(tǒng)所見诊沪,從而也就不可用。而broadcast receiver廣播接收者的注冊分靜態(tài)注冊(在AndroidManifest文件中進(jìn)行配置)和通過代碼動態(tài)創(chuàng)建并以調(diào)用Context.registerReceiver()的方式注冊至系統(tǒng)曾撤。需要注意的是在AndroidManifest文件中進(jìn)行配置的廣播接收者會隨系統(tǒng)的啟動而一直處于活躍狀態(tài)端姚,只要接收到感興趣的廣播就會觸發(fā)(即使程序未運(yùn)行)。

(2)4大組件的激活

內(nèi)容提供者的激活:當(dāng)接收到ContentResolver發(fā)出的請求后挤悉,內(nèi)容提供者被激活渐裸。而其它三種組件activity、服務(wù)和廣播接收器被一種叫做intent的異步消息所激活。

(3)4大組件的關(guān)閉

內(nèi)容提供者僅在響應(yīng)ContentResolver提出請求的時候激活昏鹃。而一個廣播接收器僅在響應(yīng)廣播信息的時候激活尚氛。所以,沒有必要去顯式的關(guān)閉這些組件洞渤。Activity關(guān)閉:可以通過調(diào)用它的finish()方法來關(guān)閉一個activity阅嘶。服務(wù)關(guān)閉:對于通過startService()方法啟動的服務(wù)要調(diào)用Context.stopService()方法關(guān)閉服務(wù),使用bindService()方法啟動的服務(wù)要調(diào)用Contex.unbindService()方法關(guān)閉服務(wù)载迄。

(4)android中的任務(wù)(activity棧)

(a)任務(wù)其實就是activity的棧讯柔,它由一個或多個Activity組成,共同完成一個完整的用戶體驗护昧。棧底的是啟動整個任務(wù)的Activity魂迄,棧頂?shù)氖钱?dāng)前運(yùn)行的用戶可以交互的Activity,當(dāng)一個activity啟動另外一個的時候惋耙,新的activity就被壓入棧捣炬,并成為當(dāng)前運(yùn)行的activity。而前一個activity仍保持在棧之中怠晴。當(dāng)用戶按下BACK鍵的時候遥金,當(dāng)前activity出棧,而前一個恢復(fù)為當(dāng)前運(yùn)行的activity蒜田。棧中保存的其實是對象稿械,棧中的Activity永遠(yuǎn)不會重排,只會壓入或彈出冲粤。

(b)任務(wù)中的所有activity是作為一個整體進(jìn)行移動的美莫。整個的任務(wù)(即activity棧)可以移到前臺,或退至后臺梯捕。

(c)Android系統(tǒng)是一個多任務(wù)(Multi-Task)的操作系統(tǒng)厢呵,可以在用手機(jī)聽音樂的同時,也執(zhí)行其他多個程序傀顾。每多執(zhí)行一個應(yīng)用程序襟铭,就會多耗費一些系統(tǒng)內(nèi)存,當(dāng)同時執(zhí)行的程序過多短曾,或是關(guān)閉的程序沒有正確釋放掉內(nèi)存寒砖,系統(tǒng)就會覺得越來越慢,甚至不穩(wěn)定嫉拐。為了解決這個問題哩都,Android引入了一個新的機(jī)制,即生命周期(Life Cycle)婉徘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漠嵌,一起剝皮案震驚了整個濱河市咐汞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儒鹿,老刑警劉巖化撕,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挺身,居然都是意外死亡侯谁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門章钾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墙贱,“玉大人,你說我怎么就攤上這事贱傀〔移玻” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵府寒,是天一觀的道長魁衙。 經(jīng)常有香客問我,道長株搔,這世上最難降的妖魔是什么剖淀? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纤房,結(jié)果婚禮上纵隔,老公的妹妹穿的比我還像新娘。我一直安慰自己炮姨,他們只是感情好捌刮,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舒岸,像睡著了一般绅作。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛾派,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天俄认,我揣著相機(jī)與錄音,去河邊找鬼洪乍。 笑死眯杏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典尾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼糊探,長吁一口氣:“原來是場噩夢啊……” “哼钾埂!你這毒婦竟也來了河闰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤褥紫,失蹤者是張志新(化名)和其女友劉穎姜性,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體髓考,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡部念,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氨菇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡炼。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖查蓉,靈堂內(nèi)的尸體忽然破棺而出乌询,到底是詐尸還是另有隱情,我是刑警寧澤豌研,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布妹田,位于F島的核電站,受9級特大地震影響鹃共,放射性物質(zhì)發(fā)生泄漏鬼佣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一霜浴、第九天 我趴在偏房一處隱蔽的房頂上張望晶衷。 院中可真熱鬧,春花似錦坷随、人聲如沸房铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸匪。三九已至,卻和暖如春类溢,著一層夾襖步出監(jiān)牢的瞬間凌蔬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工闯冷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留砂心,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓蛇耀,卻偏偏與公主長得像辩诞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纺涤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容