前言
Android的生命周期相對來說是比較基礎(chǔ)的知識點袁铐,但卻是非常重要的糖耸。精準的掌握并熟練地使用會讓我們的代碼更有邏輯性且更加健壯。我們都知道人的記憶是曲線的枢步,只有不斷地回顧沉删,不斷地溫習(xí),這樣在我們拿出來用的時候不至于出現(xiàn)間斷性的記憶空白醉途。
正文
我們今天來系統(tǒng)的總結(jié)一下Android的生命周期矾瑰,比如正常狀況下的生命周期,以及非正常狀態(tài)下的生命周期结蟋。比如旋轉(zhuǎn)屏幕時的生命周期以及異常情況下如何保存Activity的狀態(tài)脯倚。先讓我們來看一下官方給出的圖解:
呀渔彰!有點看不懂嵌屎。沒關(guān)系,我剛開始也沒看懂恍涂,讓我們看不同操作生命周期的流程宝惰,寫幾個小Demo,相信我們回過頭來再看就清晰多了再沧。讓我們來新建一個工程ActivityTest來驗證一下每個流程尼夺。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "ActivityTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "---onCreate()---");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "---onStart()---");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "---onRestart()---");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "---onResume()---");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "---onPause()---");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "---onStop()---");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "---onDestroy()---");
}
}
我們先看一下七個方法的作用,然后再來分析一下不同情況的流程:
- onCreate()??表示Activity正在被創(chuàng)建
- onRestart()??Activity正在重新啟動
- onStart()???activity變?yōu)樵谄聊簧蠈τ脩艨梢姇r調(diào)用
- onResume()??開始與用戶交互時調(diào)用
- onPause()???Activity正在停止炒瘸,失去焦點
- onStop()???Activity即將停止淤堵,且處于不可見狀態(tài)
- onDestory()??Activity正在被銷毀
正常情況
第一次啟動一個Activity
依次調(diào)用:onCreate-->onStart-->onResum 讓我們來看一下Log。
當(dāng)我們點擊Back退回到桌面
依次調(diào)用:onPause-->onStop-->onDestory 讓我們來看一下Log顷扩。
當(dāng)我們點擊Home鍵返回桌面時
依次調(diào)用:onPause()-->onStop() 讓我們來看一下Log拐邪。
??注意當(dāng)我們點擊Home鍵退回到桌面時并沒有調(diào)用onDestory,因為此時Activity只是處于后臺不可見的狀態(tài)隘截,并沒有被銷毀扎阶。
當(dāng)我們從后臺切回到Activity時
依次調(diào)用onRestart-->onStart-->onResume 我們看一下log
??我們會發(fā)現(xiàn)并沒有調(diào)用onCreate,因為此前Activity處于停滯狀態(tài)婶芭,并沒有被銷毀所以不需要重新創(chuàng)建东臀。但是值得注意的是當(dāng)系統(tǒng)資源不足時會導(dǎo)致后臺Activity被殺死。當(dāng)Activity被殺死的時候犀农,你去啟動它你就會發(fā)現(xiàn)和第一次啟動它的生命周期是相同的惰赋。接下來我們看看非正常情況下的生命周期。
onWindowFocusChanged
在我們介紹它非正常情況的生命周期之前呵哨,我們先來看看它的onWindowFocusChanged()方法谤逼。這個onWindowFocusChanged指的是這個Activity得到或者失去焦點的時候會被調(diào)用,也許這么說不太好理解仇穗,我們可以認為他是Activity完全加載之后調(diào)用流部。
??啟動Activity
??退出Activity
??看Log信息我們會發(fā)現(xiàn)在啟動Activity和退出Activity時他都會調(diào)用。在啟動Activity時他是在onResume之后纹坐,也就是Activity獲得焦點之后枝冀。在退出Activity時他在onPause之后調(diào)用舞丛,此時Activity失去焦點,這也就驗證我們之前所述果漾。
??如果之前你寫過FrameAnimation你會發(fā)現(xiàn)球切,當(dāng)我們在onCreate內(nèi)start動畫時,Activity啟動了但并沒有動畫的效果绒障,如果你將start放在onWindowFocusChanged內(nèi)就會達到預(yù)期的效果了吨凑。這是因為在onCreate的時候Activity并沒有獲得焦點,而onWindowFocusChanged是在Activity獲得焦點之后調(diào)用户辱。
非正常情況
-
屏幕旋轉(zhuǎn)
??當(dāng)屏幕旋轉(zhuǎn)的時候我們發(fā)現(xiàn)Activity先是被銷毀之后又被重建鸵钝。而且我們還發(fā)現(xiàn)雖然Activity被重建了,但是控件里的內(nèi)容還在庐镐,這是為什么呢恩商。
??這是因為當(dāng)Activity不是正常退出的時候,它不僅調(diào)用onPause必逆,onStop怠堪,onDestory,它會在調(diào)用onStop之前調(diào)用onSaveInstanceState這個方法來保存一些數(shù)據(jù)名眉,當(dāng)Activity重建的時候粟矿,這個方法所存儲的數(shù)據(jù)會以Bundle作為參數(shù)傳遞給onCreate,所以我們可以用參數(shù)來判斷這個Activity是新建的還是重建的损拢,如果是重建的陌粹,則可以從Bundle中取出數(shù)據(jù)來恢復(fù)界面。
??那我們可不可以不讓他銷毀并重新創(chuàng)建呢探橱?
??答案是肯定的申屹,你只需要在AndroidManifest文件中的對應(yīng)Activity中配置
android:configChanges="keyboardHidden|orientation|screenSize",最好這三個都配置隧膏,否則不能適配所有機型或sdk版本哗讥。
??設(shè)置之后你會發(fā)現(xiàn)不會銷毀和重新創(chuàng)建了,只會調(diào)用onConfigurationChanged這一個方法胞枕,所以我們可以在里面做一些特殊的操作杆煞。
當(dāng)然如果你不想讓他旋轉(zhuǎn)就在AndroidManifest文件中的對應(yīng)Activity中配置android:screenOrientation=”landscape”(橫屏,portrait是豎屏)腐泻;
尾語
今天我們就先總結(jié)就先到這里决乎,相信你現(xiàn)在回個頭看官方圖解會有新的感覺,且對生命周期也有了一定的了解派桩。因為筆者水平有限构诚,如有紕漏或不足往指出,我一定會積極改正铆惑,希望我們一起進步吧范嘱。
注K蜕拧!丑蛤!
總結(jié)不易叠聋,請尊重勞動成果,轉(zhuǎn)載請標明出處受裹,謝謝B挡埂!棉饶!