51CTO專家專欄 李洋談Android應(yīng)用程序管理
原創(chuàng)【51CTO獨(dú)家特稿】在繼《李洋談Android安全框架》系列文章之后,本文李洋老師將向我們介紹《Android應(yīng)用程序管理》。
1. 簡(jiǎn)介
Android一詞的本義指“機(jī)器人”,谷歌的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)以“Android”命名,以機(jī)器人為標(biāo)志。Android系統(tǒng)早期由谷歌開(kāi)發(fā),后由開(kāi)放手持設(shè)備聯(lián)盟(Open Handset Alliance,OHA)開(kāi)發(fā)。OHA由谷歌與34家廠商一起于2007年11月5日創(chuàng)立,包括手機(jī)制造商、電信運(yùn)營(yíng)商和芯片制造商,如下表。OHA創(chuàng)立的同時(shí),谷歌發(fā)布了Android系統(tǒng)。
Android采用了軟件堆層(Software stack,又名以軟件疊層)的架構(gòu),主要分為三部分,包括底層Linux內(nèi)核、Android中間件和系統(tǒng)關(guān)鍵應(yīng)用程序。Android中間件以Dalvik虛擬機(jī)為基礎(chǔ)構(gòu)成,這是由谷歌自己設(shè)計(jì)開(kāi)發(fā)的Java Virtual Machine。Android上的應(yīng)用使用Java語(yǔ)言開(kāi)發(fā),Android SDK為在Android系統(tǒng)上開(kāi)發(fā)Java應(yīng)用提供了一整套開(kāi)發(fā)工具和API。
2. 應(yīng)用程序組成
Android的每個(gè)應(yīng)用程序都對(duì)應(yīng)一個(gè)安裝包,稱之為APK (Android Package), 在系統(tǒng)運(yùn)行時(shí)每一個(gè)APK對(duì)應(yīng)一個(gè)操作系統(tǒng)進(jìn)程。
下圖所示為APK中所包含的組件
(1)Activity:Activity就是一個(gè)界面,這個(gè)界面里面可以放置各種控件,如短信編輯框等;
(2)Service:服務(wù)是運(yùn)行在后臺(tái)的功能模塊。如文件下載、音樂(lè)播放程序等;
(3)Content Provider:它是Android平臺(tái)應(yīng)用程序間數(shù)據(jù)共享的一種標(biāo)準(zhǔn)接口,它以類似于URI(Universal Resources Identification)的方式來(lái)表示數(shù)據(jù),如:content://contacts/people/1101;
(4)Broadcast Receiver:與此組件相關(guān)的概念是Intent,Intent是一個(gè)對(duì)動(dòng)作和行為的抽象描述,負(fù)責(zé)一個(gè)程序的組件之間、不同程序之間進(jìn)行消息傳遞,Intent包括目標(biāo)組件地址和消息數(shù)據(jù)。Broadcast Receiver組件負(fù)責(zé)實(shí)現(xiàn)偵聽(tīng)I(yíng)ntent消息并對(duì)其作出反應(yīng)。
下圖為APK中各組件之間的典型關(guān)系示例。
3. 應(yīng)用程序生命周期管理
Android的每個(gè)應(yīng)用程序以一個(gè)Linux進(jìn)程運(yùn)行,默認(rèn)情況下,在進(jìn)程中執(zhí)行一個(gè)單一的線程,應(yīng)用程序所有的組件均在這個(gè)進(jìn)程的這個(gè)線程中運(yùn)行。當(dāng)然也可以為任意進(jìn)程衍生出其它線程。Android系統(tǒng)會(huì)盡可能長(zhǎng)的延續(xù)一個(gè)應(yīng)用程序進(jìn)程執(zhí)行,確保其正常執(zhí)行結(jié)束。除了應(yīng)用程序執(zhí)行結(jié)束后,正常釋放內(nèi)存外,在內(nèi)存過(guò)低超過(guò)閥值時(shí),系統(tǒng)仍然會(huì)不可避免需要移除舊的進(jìn)程。為決定保留或移除一個(gè)進(jìn)程,Android將每個(gè)進(jìn)程都放入一個(gè)“重要性層次”中,依據(jù)則是它其中運(yùn)行著的組件及其狀態(tài)。重要性***的進(jìn)程首先被消滅,然后是較低的,依此類推。重要性共分五層,依據(jù)重要性列表如下:
(1)前臺(tái)進(jìn)程是用戶操作所必須的, 任一時(shí)間下,僅有少數(shù)進(jìn)程會(huì)處于前臺(tái),僅當(dāng)內(nèi)存實(shí)在無(wú)法供給它們維持同時(shí)運(yùn)行時(shí)才會(huì)被殺死。
(2)可視進(jìn)程沒(méi)有前臺(tái)組件,但仍可被用戶在屏幕上所見(jiàn)??梢曔M(jìn)程依然被視為是很重要的,非到不殺死它們便無(wú)法維持前臺(tái)進(jìn)程運(yùn)行時(shí),才會(huì)被殺死。
(3)服務(wù)進(jìn)程是由startService() 方法啟動(dòng)的服務(wù),它不會(huì)變成上述兩類。盡管服務(wù)進(jìn)程不會(huì)直接為用戶所見(jiàn),但它們一般都在做著用戶所關(guān)心的事情(比如在后臺(tái)播放mp3 或者從網(wǎng)上下載東西)。所以系統(tǒng)會(huì)盡量維持它們的運(yùn)行,除非系統(tǒng)內(nèi)存不足以維持前臺(tái)進(jìn)程和可視進(jìn)程的運(yùn)行需要。
(4)背景進(jìn)程包含目前不為用戶所見(jiàn)的activity。這些進(jìn)程與用戶體驗(yàn)沒(méi)有直接的聯(lián)系,可以在任意時(shí)間被殺死以回收內(nèi)存供前臺(tái)進(jìn)程、可視進(jìn)程以及服務(wù)進(jìn)程使用。
(5)空進(jìn)程不包含任何活動(dòng)應(yīng)用程序組件。這種進(jìn)程存在的唯一原因是作為緩存以改善組件再次于其中運(yùn)行時(shí)的啟動(dòng)時(shí)間。系統(tǒng)經(jīng)常會(huì)殺死這種進(jìn)程以保持進(jìn)程緩存和系統(tǒng)內(nèi)核緩存之間的平衡。
Android會(huì)依據(jù)進(jìn)程中當(dāng)前活躍組件的重要程度來(lái)盡可能高的估量一個(gè)進(jìn)程的級(jí)別。比如說(shuō),如果一個(gè)進(jìn)程中同時(shí)有一個(gè)服務(wù)和一個(gè)可視的activity,則進(jìn)程會(huì)被判定為可視進(jìn)程,而不是服務(wù)進(jìn)程。
此外,一個(gè)進(jìn)程的級(jí)別可能會(huì)由于其它進(jìn)程依賴于它而升高。一個(gè)為其它進(jìn)程提供服務(wù)的進(jìn)程級(jí)別永遠(yuǎn)高于使用它服務(wù)的進(jìn)程。
4. 實(shí)現(xiàn)應(yīng)用程序開(kāi)機(jī)自動(dòng)啟動(dòng)
任何一個(gè)Android應(yīng)用程序要實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)啟動(dòng), 必須做到如下兩點(diǎn):
1) 繼承BroadcastReceiver類,并實(shí)現(xiàn)onReceive()方法,在此方法中啟動(dòng)應(yīng)用程序。
2) 在應(yīng)用程序的AndroidManifest.xml文件中訂閱BOOT_COMPLETED消息,如下:
- <receiver android:name="HelloWorldStartupIntentReceiver" >
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>