標籤:
Android是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裡的活動的集合,這個棧也被稱作返回棧(Back Stack)。
棧是一種後進先出的資料結構,在預設情況下,每當我們啟動了一個新的活動,它會在返回棧中入棧,並處於棧頂的位置。
每當我們按下Back鍵或調用finish()方法去銷毀一個活動時,處於棧頂的活動會出棧,這時前一個入棧的活動就會重新處於棧頂的位置。系統總是會顯示處於棧頂的活動給使用者。
一、活動狀態
每個活動在其生命週期中最多可能會有四種狀態。
1. 運行狀態
當一個活動位於返回棧的棧頂時,這時活動就處於運行狀態。系統最不願意回收的就是處於運行狀態的活動,因為這會帶來非常差的使用者體驗。
2. 暫停狀態
當一個活動不再處於棧頂位置,但仍然可見時,這時活動就進入了暫停狀態。你可能會覺得既然活動已經不在棧頂了,還怎麼會可見呢?這是因為並不是每一個活動都會佔滿整個螢幕的,
比如對話方塊形式的活動只會佔用螢幕中間的部分地區,你很快就會在後面看到這種活動。處於暫停狀態的活動仍然是完全存活著的,系統也不願意去回收這種活動
(因為它還是可見的,回收可見的東西都會在使用者體驗方面有不好的影響),只有在記憶體極低的情況下,系統才會去考慮回收這種活動。
3. 停止狀態
當一個活動不再處於棧頂位置,並且完全不可見的時候,就進入了停止狀態。系統仍然會為這種活動儲存相應的狀態和成員變數,但是這並不是完全可靠的,當其他地方需要記憶體時,處於停止狀態的活動有可能會被系統回收。
4. 銷毀狀態
當一個活動從返回棧中移除後就變成了銷毀狀態。系統會最傾向於回收處於這種狀態的活動,從而保證手機的記憶體充足。
二、活動的生存周期
Activity類中定義了七個回調方法,覆蓋了活動生命週期的每一個環節,下面介紹下這七個方法。
1. onCreate()
這個方法你已經看到過很多次了,每個活動中我們都重寫了這個方法,它會在活動第一次被建立的時候調用。你應該在這個方法中完成活動的初始化操作,比如說載入布局、綁定事件等。
2. onStart()
這個方法在活動由不可見變為可見的時候調用。
3. onResume()
這個方法在活動準備好和使用者進行互動的時候調用。此時的活動一定位於返回棧的棧頂,並且處於運行狀態。
4. onPause()
這個方法在系統準備去啟動或者恢複另一個活動的時候調用。我們通常會在這個方法中將一些消耗CPU的資源釋放掉,以及儲存一些關鍵資料,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。
5. onStop()
這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於,如果啟動的新活動是一個對話方塊式的活動,那麼onPause()方法會得到執行,而onStop()方法並不會執行。
6. onDestroy()
這個方法在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。
7. onRestart()
這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。
Android官方提供了一張活動生命週期的
以上七個方法中除了onRestart()方法,其他都是兩兩相對的,從而又可以將活動分為三種生存期。
1. 完整生存期
活動在onCreate()方法和onDestroy()方法之間所經曆的,就是完整生存期。一般情況下,一個活動會在onCreate()方法中完成各種初始化操作,而在onDestroy()方法中完成釋放記憶體的操作。
2. 可見生存期
活動在onStart()方法和onStop()方法之間所經曆的,就是可見生存期。在可見生存期內,活動對於使用者總是可見的,即便有可能無法和使用者進行互動。
我們可以通過這兩個方法,合理地管理那些對使用者可見的資源。比如在onStart()方法中對資源進行載入,而在onStop()方法中對資源進行釋放,從而保證處於停止狀態的活動不會佔用過多記憶體。
3. 前台生存期
活動在onResume()方法和onPause()方法之間所經曆的,就是前台生存期。在前台生存期內,活動總是處於運行狀態的,此時的活動是可以和使用者進行相互的,我們平時看到和接觸最多的也這個狀態下的活動。
Android:Activity生命週期