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