1. 程式人生 > >Activity的生命週期詳解+面試 Activity的啟動模式

Activity的生命週期詳解+面試 Activity的啟動模式

Activity的生命週期中分為三態度:執行態,暫停態和停止態;

1.執行態:

當Activity在螢幕的最前面,就是你可以看到的,有焦點的那個介面(有焦點:你可以在上面點選和觸控的,使用者可以用來操作的).處於執行態的Activity,Android會盡可能的保持他的執行,即便出現了記憶體不足的時候,android系統也會先把棧底的Activity殺死,確保可見的Activity正常執行.

2.暫停態:

Activity對使用者來說是可見的,但是失去焦點(使用者不可以在這個Activity上面操作了),當記憶體不足的時候,這個暫態的Activity可能被殺死;

3.停止態:

當Activity處於完全不可見的時候,但是任保留著當前狀態的和成員資訊,當系統記憶體不足的時候,這個Activity就很容易被殺死.

Activity從一種狀態轉到另一種狀態時會觸發一些事件,執行一些回撥方法來通知狀態的改變,有如下的7個方法:

· void onCreate(Bundle savedInstanceState): 在建立時執行

· void onStart():可見的時候執行

· void onRestart():對到前臺,再次可見時執行

· void onResume():獲得焦點的時候執行

· void onPause():失去焦點的時候執行

· void onStop():使用者不可見的時候執行

· void onDestory():銷燬的時候執行

(有些同學可能會很頭疼,這個要怎麼去記呢?好難噢,現在我教大家一個方法:不要孤立的去記這7個方法,兩個兩個的去記憶)

建立-銷燬 : onCreate() -onDestory()

可見-不可見:onStart()-onStop()

獲得焦點-失去焦點:onResume()-onPause()

onRestart-onStart():這是在Activity回到前臺的時候呼叫

(要是還是不太懂的結合下面這張圖,一定要自己分析這張圖的各個情況,在面試的時候經常會被問到,面試的時候也是經常拿這這圖做文章,在後面我也會幫著同學去儘量的把能問的情況都分析一遍)


ps:怎麼去理解下面的這些情況呢:首先你一定要知道這七個方法中各自的含義是什麼(可見還是不可見,失去還是獲得焦點)

①從啟動到關閉一個Activity 依次會執行:

onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()

(建立->可見->獲得焦點->失去焦點->不可見->銷燬)

②當Activity執行到onPause()方法失去焦點時,呼叫onResume()方法回到前臺

③如果程序被殺死了,重新執行Activity時要從onCreate()方法開始執行

(只要程序被殺死,再想重新執行Activity時,就必須得重走onCreate(),這裡的被殺死有自殺也有他殺;自殺:就是使用者自己關掉程式時;他殺:由於系統記憶體不足被Android系統強制殺掉了Activity)

④當執行到onStop()方法Activity不可見,Activity再回到前臺就得走 onRestart()->onStart()->onResume()

(ps:這裡講的可能比較抽象,同學們要自己去提取,聯想他在手機中的實際操作,是怎麼樣的操作會導致執行到onStop()方法後還想去再回到前臺:這也是同學們往後需要思考的地方,理論聯絡實際,這個在面試的時候:當你開啟一個Activity ,此時你按Home鍵,接著又重新進入到這個應用,請問此時Activity的生命週期的怎麼樣的呢?呼叫了哪些方法呢?------這是一道很常見的面試題目)所以在往後的學習中同學要多加註意了:變得的問法,不變的是原理,記住那個圖多出來的回去的線,那麼不就都可以解決了.

怎麼樣在一個Activity裡頭看生命週期的是不是太簡單了呢,接下來我舉個例子:在多個Activity裡頭跳轉看回調函式執行的方法(這裡頭以兩個 Activity01,和Activity02為例子)

環境:在Activity01中新增一個Button跳轉到Activity02,在log控制檯的列印

①點選一個頁面跳轉到第二個頁面

Activity01-----onCreate()

Activity01-----onStart()

Activity01-----onResume()

Activity01-----onPause()

Activity02-----onCreate()

Activity02-----onStart()

Activity02----onResume()

Activity01----onStop()

(當跳轉到第二個頁面,Activity01執行onPause()方法失去焦點,接著再執行Activity02的onCreate(),onStart(),onResume()此時Activity02的前臺可見了,那麼Activity01的前臺就要不可見了,執行Activity01的onStop()方法)

②再從Activity02按返回鍵返回到Activity01

Activity02----onPause()

Activity01---onRestart()

Activity01---onStart()

Activity01---onResume()

Activity02---onStop()

Activity02---onDestory()

(單擊返回鍵後,Activity02回先失去焦點,然後Activity01會執行onRestart(),onStart(),onResume()當Activity01獲得焦點時,Activity02才onStop(),onDestory() 不可見 銷燬)

總結下:當Activity01開啟Activity02的時候,Activity01執行了onStop()方法(這個方法是在Activity02獲得焦點的時候才會呼叫);當Activity02返回到Activity01時這是Activity01執行了onRestart(); 當兩個Activity跳轉的時候:Activity01會先失去焦點,讓Activity02得到焦點,等到Activity02完全顯示在前臺的時候Activity01才會切換到後臺

Activity的啟動模式

Android採用任務棧的方式來管理Activity的例項,當啟動一個應用的時候,Android就會建立一個任務棧,先啟動的壓入棧底(以先進後出的格式棧)


四種啟動模式(standard模式,singleTop模式,singleTask模式,singleInstance模式):

(在AndroidManifest.xml中通過 <activity>標籤的android:launchMode屬性設定啟動模式)

standard模式:

    這個的android模式的啟動模式,每當啟動一個Activity系統就會把他壓入任務棧中,並且將這個Activity壓入棧頂,系統不會判斷該Activity是否在棧中存在,每次都會建立一個新的例項


 singleTop模式:(關鍵字:top,棧頂有則複用,無則再建立)

      當啟動的Activity已經在棧頂的時候,那麼他就不會再建立一個新的Activity了,則可以直接使用他的例項不用再去建立了,但是但是這個只對棧頂有效, 這個Activity在第二位置時,此時還是會建立一個新的Activity壓入棧中


singleTask模式:(關鍵字:有則將棧中其他沒用的彈出直到要用的在棧頂,無則建立一個新的Activity並將其壓入棧頂)

 Activity在整個應用中值存在一個例項.每次啟動Activity的時候,系統會判斷該Activity的例項是否存在,有的話則將棧中其他Activity彈出棧,把這個要用的棧置於棧頂,沒有的話則建立一個新的Activity並且將這個建立的新的壓入棧頂


singleInstance模式:(和單例模式有點像)

在整個android系統只有一個例項,指定一個新的任務棧來管理這個Activity,無論從哪個任務棧中啟動Activity都只會建立一個全新的任務棧來裝載一個全新的Activity例項