汪 源,劉 芳
(大連交通大學(xué)教務(wù)處,大連116021)
Android一詞本義指機(jī)器人,Google于2007年11月發(fā)布了以Android命名的開源移動設(shè)備綜合平臺,包括其基于Linux的操作系統(tǒng)、中間件和關(guān)鍵的手機(jī)應(yīng)用。并且組建了開放手機(jī)聯(lián)盟,其成員囊括了全球著名的各大手機(jī)生產(chǎn)商和移動運(yùn)營商。2008年8月,Google又發(fā)布了網(wǎng)上應(yīng)用商店Android Market。任何一個開發(fā)者只需要借助Android發(fā)布的SDK開發(fā)手機(jī)應(yīng)用,即可把開發(fā)的應(yīng)用在Android Market上銷售。目前Android Market上已經(jīng)有一萬多的應(yīng)用程序,大大豐富了Android手機(jī)用戶的功能。一個完整的產(chǎn)業(yè)鏈已經(jīng)形成。
Android是基于Linux內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機(jī)操作系統(tǒng),早期由Google開發(fā),后由開放手持設(shè)備聯(lián)盟(Open Handset Alliance)開發(fā)。它采用了軟件堆層(software stack,又名以軟件疊層)的架構(gòu),主要分為三部分。底層Linux內(nèi)核只提供基本功能;其他的應(yīng)用軟件則由各公司自行開發(fā),部分程序以Java編寫[2]。
2010年末數(shù)據(jù)顯示,僅正式推出兩年的操作系統(tǒng)Android已經(jīng)超越稱霸十年的諾基亞(Nokia)Symbian OS系統(tǒng),采用Android系統(tǒng)主要手機(jī)廠商包括宏達(dá)電子(HTC)、三星(SAMSUNG)、摩托羅拉(MOTOROLA)、LG、Sony Ericsson、魅族 M9、聯(lián)想(LENOVO)、中興通訊(ZTE)、華為等,使之躍居全球最受歡迎的智能手機(jī)平臺,Android系統(tǒng)不但應(yīng)用于智能手機(jī),也在平板電腦市場急速擴(kuò)張。
當(dāng)一個程序第一次啟動的時候,什么是素質(zhì)模型,Android會啟動一個LINUX進(jìn)程和一個主線程。默認(rèn)的情況下,所有該程序的組件都將在該進(jìn)程和線程中運(yùn)行。同時,Android會為每個應(yīng)用程序分配一個單獨(dú)的LINUX用戶。Android會盡量保留一個正在運(yùn)行進(jìn)程,只在內(nèi)存資源出現(xiàn)不足時,Android會嘗試停止一些進(jìn)程從而釋放足夠的資源給其他新的進(jìn)程使用,也能保證用戶正在訪問的當(dāng)前進(jìn)程有足夠的資源去及時的響應(yīng)用戶的事件[3]。Android會根據(jù)進(jìn)程中運(yùn)行的組件類別以及組件的狀態(tài)來判斷該進(jìn)程的重要性,Android會首先停止那些不重要的進(jìn)程。按照重要性從高到低一共有五個級別:
1)前臺進(jìn)程
前臺進(jìn)程是用戶當(dāng)前正在使用的進(jìn)程。只有一些前臺進(jìn)程可以在任何時候都存在。他們是最后一個被結(jié)束的,當(dāng)內(nèi)存低到根本連他們都不能運(yùn)行的時候。一般來說,在這種情況下,設(shè)備會進(jìn)行內(nèi)存調(diào)度,中止一些前臺進(jìn)程來保持對用戶交互的響應(yīng)。
2)可見進(jìn)程
可見進(jìn)程不包含前臺的組件但是會在屏幕上顯示一個可見的進(jìn)程,其重要程度很高,除非前臺進(jìn)程需要獲取它的資源,不然不會被中止[4]。
3)服務(wù)進(jìn)程
運(yùn)行著一個通過 startService方法啟動的 service,這個service不屬于上面提到的2種更高重要性的進(jìn)程。service所在的進(jìn)程雖然對用戶不是直接可見的,但是他們執(zhí)行了用戶非常關(guān)注的任務(wù)(比如播放mp3,下載數(shù)據(jù)等)。只要前臺進(jìn)程和可見進(jìn)程有足夠的內(nèi)存,系統(tǒng)不會回收他們。
4)后臺進(jìn)程
運(yùn)行著一個對用戶不可見的activity。這些進(jìn)程對用戶體驗沒有直接的影響,可以在服務(wù)進(jìn)程、可見進(jìn)程、前臺進(jìn)程需要內(nèi)存的時候回收。通常系統(tǒng)中會有很多不可見進(jìn)程在運(yùn)行,他們被保存在LRU(least recently used)列表中,以便內(nèi)存不足的時候被第一時間回收。如果一個activity正確的執(zhí)行了它的生命周期,關(guān)閉這個進(jìn)程對于用戶體驗沒有太大的影響[5]。
5)空進(jìn)程
未運(yùn)行任何程序組件。運(yùn)行這些進(jìn)程的唯一原因是作為一個緩存,縮短下次程序需要重新使用的啟動時間。系統(tǒng)經(jīng)常中止這些進(jìn)程,這樣可以調(diào)節(jié)程序緩存和系統(tǒng)緩存的平衡。
Android對進(jìn)程的重要性評級的時候,選取它最高的級別。另外,當(dāng)被另外的一個進(jìn)程依賴的時候,某個進(jìn)程的級別可能會增高。一個為其他進(jìn)程服務(wù)的進(jìn)程永遠(yuǎn)不會比被服務(wù)的進(jìn)程重要級低。因為服務(wù)進(jìn)程比后臺activity進(jìn)程重要級高,因此一個要進(jìn)行耗時工作的activity最好啟動一個service來做這個工作,而不是開啟一個子進(jìn)程。特別是這個操作需要的時間比activity存在的時間還要長的時候。例如,在后臺播放音樂,向網(wǎng)上上傳圖片等。使用service可以使進(jìn)程最少獲取到“服務(wù)進(jìn)程”級別的重要級,而不用考慮activity目前是什么狀態(tài)。
當(dāng)一個程序第一次啟動時,Android會同時啟動一個對應(yīng)的主線程(Main Thread),主線程主要負(fù)責(zé)處理與UI相關(guān)的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對應(yīng)的組件進(jìn)行處理。所以主線程通常又被叫做UI線程。在開發(fā)Android應(yīng)用時必須遵守單線程模型的原則:Android UI操作并不是線程安全的并且這些操作必須在UI線程中執(zhí)行[6]。
應(yīng)用時必須遵守單線程模型的原則:Android UI操作并不是線程安全的并且這些操作必須在UI線程中執(zhí)行。由于UI線程負(fù)責(zé)事件的監(jiān)聽和繪圖,因此,必須保證UI線程能夠隨時響應(yīng)用戶的需求,UI線程里的操作應(yīng)該向中斷事件那樣短小,費(fèi)時的操作(如網(wǎng)絡(luò)連接)需要另開線程,否則,如果UI線程超過5s沒有響應(yīng)用戶請求,會彈出對話框提醒用戶終止應(yīng)用程序[7]。
如果在新開的線程中需要對UI進(jìn)行設(shè)定,就可能違反單線程模型,因此android采用一種復(fù)雜的Message Queue機(jī)制保證線程間通信。
本文首先介紹了Android的進(jìn)程與單線程模型及其原則。進(jìn)一步認(rèn)識和理解Android的單線程模型及其原則。由于更多地關(guān)注Android的進(jìn)程與單線程模型,本文或許不足以幫助讀者全面的認(rèn)識Android技術(shù),關(guān)于文中提到的其他技術(shù)細(xì)節(jié)以及Android的其他相關(guān)技術(shù)可以訪問Android的官方網(wǎng)站進(jìn)行進(jìn)一步的了解和學(xué)習(xí)。
[1]田亞平.智能終端OS之博愈烈Android能否分一杯羹[J].今日電子,2009,(3):23.
[2]http://baike.baidu.com/view/3091265.htm(網(wǎng)絡(luò)資料)
[3] http://www.cnmsdn.com/html/201010/1287295341ID8320.html(網(wǎng)絡(luò)資料)
[4]孫曉宇.Android手機(jī)界面管理系統(tǒng)的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2009.
[5]許翠蘋.手機(jī)操作系統(tǒng)列強(qiáng)爭霸進(jìn)行時[J].通訊世界,2010,(7):24-25.
[6]王軍偉,武巖,易勇.淺論Android線程模型[J].中國電子商務(wù),2009,(9):72.
[7]張誠潔.Android在線圖書閱讀器設(shè)計與實現(xiàn)[J].微計算機(jī)應(yīng)用,2010,31(10):77-80.