在上一篇文章中我們瞭解到Android系統啟動應用的時候,會首先載入AndroidManifest.xml清單檔案中的一系列資訊,在清單檔案中如果不指定<application></application>標籤中的name屬性值,會預設使用android.app.Application
作為應用程式載入類,其生命週期與應用程式生命週期是一致的。那麼到底應用程式有怎樣的生命週期,在不同的生命週期有哪些呼叫方法可以使用?這章將詳細介紹。
生命週期
應用例項化
首先要知道,一個應用程式,有且僅有一個android.app.Application類與之對應,如果想在清單檔案中使用自定義的Application
,也必須是繼承自android.app.Application
的子類。Application
的例項在Android系統啟動應用時優先於應用中其他任何類而建立。
應用載入執行環境
由於Applicaiton
是android.content.ContentWrapper的子類,所以在Application
被例項化建立後,Android系統會優先呼叫該類的attachBaseContext(Context base)
方法,從而將上下文環境base引數與該應用程式繫結。
這裡的 android.content.Context是Android系統對應用程式建立的執行環境,通過該類可以訪問應用程式的資原始檔、傳送意圖、接收廣播等應用程式級操作。
Android系統中定義ContentWrapper
類作為父類,被需要繫結上下文環境的元件繼承。理論上,任何繼承自ContentWrapper
的子類,都可以過載其attachBaseContent(Context base)
方法,同時在該方法內保證優先呼叫其父類方法super.attachBaseContext(base)
以確保該元件被正常載入。然而並不推薦過載該方法,如果只是想獲取上下文環境使用,在元件類內部,只要是在呼叫attachBaseContent(Contxt base)
之後,都可以呼叫getBaseContext()
獲得該元件的上下文環境。
應用建立
當Application
類與上下文環境繫結後,說明該應用程式已經載入執行環境,Android系統會繼續呼叫onCreate()
方法,表明該應用程式已建立。所以自定義的Application
可以過載該方法,以完成在應用程式建立初期就要執行的操作。一般應用中使用的第三方框架都會在此處初始化,以保證應用建立之時就初始化框架結構。在過載該方法時,一定要優先呼叫其父類方法super.onCreate()
。
其他應用內操作
之後Android系統再根據清單檔案中的元件資訊分別載入建立...... 此段暫且不提。
應用硬體改變
在應用程式執行過程中,當Android系統所搭載的硬體裝置發生變化時,Android系統會呼叫該類的onConfigurationChanged(Configuration newConfig)
方法。如果過載該方法,可以響應android.content.res.Configuration類中所涉及到的硬體裝置變化,例如常見的橫豎屏切換、應用夜間主題與正常主題切換等,都可以在這裡處理。另外,在過載該方法時,一定要優先呼叫其父類方法super.onConfigurationChanged(newConfig)
。
應用低記憶體警告
Android系統執行記憶體空間使用殆盡,可能導致應用程式無法正常執行。而此時當前應用程式如果還在前臺執行,Android系統會呼叫該類的onLowMemory()
方法,之後會殺死應用程式中的後臺服務。如果過載該方法,可以釋放一些不需要的資源,以防止記憶體空間進一步縮減,將可能保留前臺介面。同樣,在過載該方法時,一定要優先呼叫其父類方法super.onLowMemory()
。
應用記憶體殺死
而當Android系統執行記憶體空間使用殆盡時,應用程式也可能恰好在後臺執行,此時Android系統會呼叫該類的onTrimMemory(int level)
方法,以表明應用程式即將被Android系統殺死。其中的level引數可以表明當前應用程式所處等級,level等級低的將優先被Android系統完全殺死。如果過載該方法,則不是釋放資源就能解決的了,可以執行一些資料持久化儲存操作,防止應用程式被殺死後再次啟動後出現數據不一致的情況。同樣,在過載該方法時,一定要優先呼叫其父類方法super.onTrimMemory(level)
。
值得注意的是,應用程式被使用者主動殺死時,在該類中是沒有方法響應的。
常用案例
儲存應用程式全域性變數使用。不推薦該方式,因為當應用程式中含有多個程序時,每個程序在建立時都會開闢新的記憶體空間,同時在新記憶體中建立新的
Application
例項與之對應,不同程序中的全域性變數也就不一致了。初始化第三方框架,具體使用方式可根據第三方框架教程相應呼叫。