先發一張經典的不能再經典的activity生命周期圖
首先聲明一點,我認為對于剛接觸Android不久的人,了解一下就可以,沒必要弄懂深層次的東西,本篇文章主要面向實習生面試。一般實習生面試,面試官都會涉及到Android四大組件,而activity的生命周期又非常基礎和重要,下面我先根據上面的圖簡單解析一下:
在正常情況下,一個activity被啟動會經歷如圖所示生命周期?
(1)onCreate: ?表示activity正在被創建
(2)onRestart:?當activity從不可見狀態變為可見狀態時,會調用此方法
(3)onStart:?此方法被調用時表示activity已經顯示出來了,但是activity沒有在前臺,無法和用戶交互
(4)onResume:?表示activity已經可見,到了前臺并可以和用戶交互
(5)onPause: 當Activity被一些窗口遮擋住的時候就會調用此方法,例如彈出dialog
(6)onStop: 當activity不可見的時候會調用此方法,例如跳轉activity,按home鍵
(7)onDestroy: 當activity被銷毀的時候會調用此方法,例如在activity中執行finish()方法
在這里強調幾個問題:
(1) 當activity被銷毀時,再哪個生命周期函數中做數據保存工作最可靠?
答案是在onPause函數中。
根據上面的聲明周期圖中我們可以看出,如果activity處于onPause時,如果系統內存不足,當前的activity進程就有可能被殺死,所以在onPause中做數據保存工作最可靠。
(2)在屏幕狀態發生改變時,例如豎屏變為橫屏,這時activity會執行哪些生命周期方法?
這就涉及到了在異常狀況下activity的生命周期:看下面我的測試程序圖
當我點擊了橫豎屏切換的時候會調用這些方法
onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume
這里我們注意到多了一個onSaveInstanceState方法和onRestoreInstanceState方法,onSaveInstanceState方法是當activity是在異常情況下終止時,會被調用,用于保存數據。然后當activity被重新創建的時候會調用onRestoreInstanceState,用于恢復數據。這里要提到一點,就是在onCreate中也可以恢復數據,二者的區別是:onRestoreInstanceState一旦被調用,其參數Bundle saceInstanceState一定是有值的,但是onCreate不行,如果onCreate正常啟動的話,其參數Bundle saceInstanceState是為null的,必須要進行判斷是否為空。
我再補充兩個容易被忽略的生命周期調用情況
1 關閉屏幕 onPause->onSaveInstanceState->onStop
? ?再打開屏幕 onRestart->onStart->onResume
2 在主界面按home鍵 onPause->onSaveInstanceState->onStop
? ?再次回到主界面 onRestart->onStart->onResume
一般作為實習生參加面試,面試官是不會涉及到activity的啟動模式相關問題,不過也會有個別面試官喜歡深入一點,如果這時你回答上來了,那肯定就是加分項,下面我就簡單介紹一下Android里面activity的啟動模式:
activity的啟動模式有四種
(1) standard ? ?標準模式
? ? 默認的啟動模式,不管有沒有已經存在的實例,都會生成新的實例。
(2) ?singleTop ? 棧頂復用模式
? ? 假設一個activity的啟動模式設置為singleTop,當一個activity要跳轉到這個activity時,如果該activity存在任務棧中且處于棧頂,那么將不會生成一個新的該activity,而會重復利用這個activity,并且會回調該activity中的OnNewIntent方法。
(3) ?singleTask ? ?棧內復用模式
? ? 這是一種單例模式,只要activity在一個棧中存在,那么多次啟動該activity都不會重新創建實例,并且默認具有clearTop的功能,就是假如一個人物張總有ABCD四個activity,A的啟動模式為 singleTask,A處于棧底,D處于棧頂,如果這時啟動A,那么BCD都將會被清除出棧,也就是在A之上的都會被清除,這就是clearTop。
(4) ?singleInstance ? ?單實例模式
? ? 它具有singleTask的所有特性,并且這種模式下,該activity只能單獨處于一個任務棧中,所以啟動它時系統會為這個activity新建一個任務棧。
關于activity的啟動模式,想深入了解的人可以在其他地方多了解了解,這里我只是做個簡單介紹,應該足以應付實習生面試。
最后在分享一下安卓實習面試經驗,四大組件非常重要,四大組件非常重要,四大組件非常重要。