在Android平臺下如何控制應(yīng)用程序生命周期
我們向很多朋友介紹過Android特有的虛擬機(jī):Dalvik虛擬機(jī)工作原理介紹。Android各個(gè)應(yīng)用在運(yùn)行時(shí)的進(jìn)程管理和內(nèi)存管理都是相對獨(dú)立的,Android應(yīng)用程序并不能控制自己的生命周期。本文將介紹如何控制應(yīng)用程序生命周期。
一、前言
與大多數(shù)傳統(tǒng)的操作系統(tǒng)環(huán)境不同,Android應(yīng)用程序并不能控制自己的生命周期。所以應(yīng)用的各個(gè)組件(activity,Service……)就得時(shí)刻小心的監(jiān)聽?wèi)?yīng)用的狀態(tài)變化對它們的影響,防止在不適當(dāng)?shù)臅r(shí)機(jī)被終止掉。(可能會造成數(shù)據(jù)丟失哦)
在Android中每個(gè)應(yīng)用都具有獨(dú)立的進(jìn)程運(yùn)行在獨(dú)立的Dalvik(Android特有的虛擬機(jī))。各個(gè)應(yīng)用在運(yùn)行時(shí)的進(jìn)程管理和內(nèi)存管理都是相對獨(dú)立的。Android使用一種“侵占性”的方式管理系統(tǒng)資源,這意味著為了釋放資源給高優(yōu)先級的程序(通常情況下是正在與用戶進(jìn)行直接交互的程序),某些進(jìn)程及其宿主程序?qū)跊]有任何提示警告的情況下被無情的結(jié)束。
二、理解應(yīng)用的優(yōu)先級和進(jìn)程狀態(tài)
結(jié)束一些進(jìn)程是為了釋放回收資源,那么那些進(jìn)程會被結(jié)束?是A先結(jié)束還是B先結(jié)束呢?這決定于宿主應(yīng)用程序的優(yōu)先級了。一個(gè)應(yīng)用的優(yōu)先級等同于具有***優(yōu)先級的組件的優(yōu)先級。如果此刻兩個(gè)程序具有相同的優(yōu)先級,那么曾經(jīng)哪個(gè)進(jìn)程處于低優(yōu)先級的時(shí)間較長,就會被結(jié)束掉。進(jìn)程的優(yōu)先級受到進(jìn)程間附屬關(guān)系的影響,比如A應(yīng)用依賴的Service或者Content Provider是由B應(yīng)用提供的,那么B將會具有更高的優(yōu)先級。所有的Android應(yīng)用都會遺留在內(nèi)存中運(yùn)行,直到系統(tǒng)需要釋放回收資源才會被結(jié)束掉。
圖示:各種進(jìn)程及其對應(yīng)的優(yōu)先級
Activity Process 活動進(jìn)程是其宿主程序更用戶直接交互的組件,Android會嘗試通過回收各種資源來保證其運(yùn)行狀態(tài)。此類進(jìn)程數(shù)量少,通常是***被結(jié)束掉的。
活動進(jìn)程包含下面幾種:
Activity處于激活狀態(tài),也就是說處于foreground,接收響應(yīng)用戶事件;
Activities, Services, or Broadcast Receivers 正在執(zhí)行處理OnReceive 事件;
Services 正在執(zhí)行處理 onStart, onCreate, or onDestroy 事件.
Visible Process 可視化,但是不處于活動狀態(tài)的Activity。它們不處于foreground也不接受響應(yīng)用戶事件。這中情況發(fā)生在Activity有部分被覆蓋了(比如我們點(diǎn)擊A里面的一個(gè)按鈕,彈出一個(gè)Dialog,此時(shí)A就變成一個(gè)可視進(jìn)程)??梢曔M(jìn)程同樣很少,只有在極端的情況下,為了保證Activity Process的運(yùn)行才會被結(jié)束掉。
Started Service Process 注意,是啟動后的服務(wù)進(jìn)程。服務(wù)進(jìn)程需要在沒有可視化界面的情況下持續(xù)運(yùn)行,因?yàn)榉?wù)沒有和用戶直接交互。它們依然被認(rèn)為是前臺進(jìn)程,只有當(dāng)Visible和Activity Process需要資源的時(shí)候才會被結(jié)束。
Background Process 一個(gè)進(jìn)程附屬在不可視的Activity 也沒有任何啟動的服務(wù)進(jìn)程就變成了后臺進(jìn)程。通常情況下Android里面會有一大堆后臺進(jìn)程,Android用 last-seen-first-killed 這種方式來結(jié)束此類進(jìn)程,從而為foreground進(jìn)程提供資源。
Empty Process 為了改善整個(gè)系統(tǒng)的性能,Android會在內(nèi)存中保留已經(jīng)結(jié)束生命周期的應(yīng)用程序。Android保留這些緩存為了是應(yīng)用能夠快速啟動。它們將會按照一貫的情況被結(jié)束掉。
綜上所述,正確的組織應(yīng)用程序,確保穩(wěn)定運(yùn)行,防止運(yùn)行中途被終止是非常重要的。
【編輯推薦】