廣大博友,看過後幫忙頂頂,謝謝大家!!!
轉載請註明: http://blog.csdn.net/richway2010/archive/2011/06/29/6574987.aspx
【博主:各位博友,網友們,大家網上好!歡迎光臨本部落格。 歡迎多多交流,多提意見,互相學習,互相進步,我們的口號是:好好學習,天天向上。】
我們學習下一個Android應用程式的生命週期是怎麼樣的?以便為後面的開發有個墊下良好的基石。
所謂的應用程式生命週期無非就是應用程式進程從建立到消亡的整個過程。但是,之所有將這一點拎出來單獨的講,當然有其特殊性。的確,Android應用程式的生命週期的終結這個動作並非由應用程式進程本身執行,而是取決於Android系統,也就是Android應用程式生死由“天”,不能主宰自己的命運。這與我們傳統的編程思維可能有所程式,如最初學的C語言程式都是最後收到內部或者外部退出請求而運行中的進程從main函數通過return退出,而非由系統直接kill的,這樣的情況很少。那麼,Android的設計師們為什麼如此設計呢?這樣設計的好處是什麼呢?
其實,主流智能手機大多數都是多任務型,筆者常常用自己的手機一邊遊戲一邊聽音樂同時可能還開著UCWeb和QQ,的確這樣給使用者帶來的體驗是無以倫比的。但是,一個不容忽視的問題就是,手機的記憶體只有那麼多,隨著我們開啟的應用程式數量的增多,隨之而來的可能會是應用程式回應時間過長或者系統假死的糟糕情況。所以,若將Android應用程式生命週期便交由系統處理的話,那麼在系統記憶體不足的情況下,便由Android系統捨車保帥,選擇性的來中止一些重要性較次的應用程式,以便回收記憶體供更重要的應用程式使用。
那麼,系統是根據一個怎樣的重要性標準來中止Android應用程式的呢?其實,Android中根據應用程式的組件以及組件當前運行狀態將所有的進程按重要性程度從高到低劃分成五個,如所示:
1、前台進程
顧名思義,前台進程就是在螢幕最最上層顯示並和使用者互動的Activity進程或者該進程的一個BroadcastReceiver正在運行。這樣的進程重要性最高,在系統中也 只有少數這樣的進程。除非在系統記憶體非常低,萬不得已的情況下才會被中止,否則系統不會選擇中止前台進程。
一般而言,滿足以下條件之一即可視為前台進程
1) 進程正在最前端運行一個和使用者互動的Activity(其OnResume()方法將被調用)
2) 進程有一個正在啟動並執行BroadcastReceiver(它的BroadcastRecevicer.onReceive()方法正在被執行)
3) 進程有一個Service,並且在Service的某個回呼函數內正有執行的代碼
2、可見進程
可見進程是指那些對於使用者可見,但是不顯示在螢幕的最前端的進程。可見進程的重要程度也是很高的,通常不會被系統所中止,除非處於捨車保帥的情況, 為了保持所有的前台進程的正常運行而不得不中止可見進程。
一般而言,滿足以下條件之一即可視為可見進程
1)有一個非前台但是仍然對使用者可見的activity(onPause()方法被調用)。例如:當前的前台的activity是一個對話方塊,上一個activity還是可見的
2)具有一個綁定到可見activity的service
3、服務進程
服務進程是擁有Service的進程,該Service是有startService()方法啟動的,這些進程通常運行在後台,並且對使用者是不可見的。但是,這些進程所作的工 作卻也是比較重要的,如在後台進行播放音樂的工作。所以,除非在保證前兩種進階別的進程能正常工作的情況下,否則系統一般不會中止服務進程的。
4、後台進程
後台進程運行著對使用者不可見的activity(調用過onStop()方法),這些進程對使用者體驗沒有直接的影響,可以在上述進程需要記憶體資源的時候,從後台進程 這回收。通常,系統中有很多的不可見的進程在運行,這些都儲存在LRU(least last used)列表中,以便記憶體不足的時候會在第一時間被回收。當需要中止進程 的時候,系統會保證最近一個被使用者看到的進程最後一個被中止。
5、空進程
在空進程中無任何的應用程式組件,而這種進程存在的唯一理由是提供一種緩衝機制,使得縮短應用程式下次啟動所需的時間。系統會經常的中止空進程, 從而達到調節程式緩衝和系統緩衝的平衡。