作為Android四大組件之一的Activity件已,熟練掌握Activity的生命周期應(yīng)該是每一個(gè)Android開發(fā)者都應(yīng)該知道的事情。下面我們就生命周期中的方法調(diào)用順序聊聊岸梨。
先看一張整體生命周期的流程圖
從上面的圖片中我們可以看到喜颁,一個(gè)Activity從誕生到死亡一共經(jīng)歷了6個(gè)階段,一般來說我們?cè)诖a中會(huì)重寫onCreate()方法與onDestroy()方法曹阔。我們很少去重其他四個(gè)方法半开,但是既然是生命周期的方法那一定會(huì)有它存在的道理。
下面我們說說每一個(gè)生命周期的方法都有什么作用赃份。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
作為Activity啟動(dòng)時(shí)執(zhí)行的第一個(gè)方法寂拆,它的主要任務(wù)是
- 綁定視圖(Layout)并且進(jìn)行繪制
- 將數(shù)據(jù)跟View進(jìn)行綁定
- 加載一些開發(fā)者在這個(gè)Activity用到的組件
onCreate方法在整個(gè)Activity的生命周期中之后調(diào)用一次,就是在創(chuàng)建這個(gè)Activity的時(shí)候去執(zhí)行。這個(gè)時(shí)候用戶是看不見界面的漓库,也就是說這個(gè)Activity還是不可見的狀態(tài)恃慧。如果我們?cè)趏nCreate()方法中執(zhí)行了耗時(shí)操作,這樣的會(huì)導(dǎo)致用戶使用時(shí)有卡頓的狀態(tài)渺蒿,影響用戶體驗(yàn)痢士。所以在onCreate()方法我們盡可能的不進(jìn)行耗時(shí)操作。
@Override
protected void onStart() {
super.onStart();
}
執(zhí)行onStart方法的時(shí)候onCreate方法已經(jīng)走完了茂装,界面的繪制也完成了怠蹂,這個(gè)時(shí)候用戶是可以看到界面的,但是不能獲取焦點(diǎn)進(jìn)行交互少态。
@Override
protected void onResume() {
super.onResume();
}
執(zhí)行onResume方法時(shí)城侧,用戶可以獲取焦點(diǎn),進(jìn)行交互彼妻,執(zhí)行完onResume后整個(gè)Activity就處于可用的狀態(tài)了嫌佑。
@Override
protected void onPause() {
super.onPause();
}
比如說我們要跳轉(zhuǎn)到其他的頁面,這個(gè)時(shí)候當(dāng)前的Activity先執(zhí)行onPause方法,讓當(dāng)前的Activity失去焦點(diǎn)侨歉,不能進(jìn)行交互屋摇,但是用戶界面是可見的。
@Override
protected void onStop() {
super.onStop();
}
在onPause方法執(zhí)行過后會(huì)執(zhí)行onStop方法幽邓,這個(gè)時(shí)候這個(gè)Activity處于暫停的轉(zhuǎn)臺(tái)并且不在前臺(tái)展示了炮温,但是還沒有被銷毀。
@Override
protected void onDestroy() {
super.onDestroy();
}
執(zhí)行onDestroy方法時(shí)我們會(huì)對(duì)這個(gè)Activity進(jìn)行銷毀牵舵,在銷毀之前JVM的GC機(jī)制會(huì)對(duì)內(nèi)存進(jìn)行回收柒啤,在這個(gè)過程中,如果我們?cè)谄渌胤酱嬖趯?duì)該Activity的強(qiáng)引用畸颅,則會(huì)導(dǎo)致內(nèi)存泄露担巩。這樣就不會(huì)執(zhí)行onDestroy方法了。
通常我們會(huì)在onDestroy方法對(duì)該Activity中綁定的Service重斑、BroadcastReceiver兵睛、eventBus、觀察者窥浪、還有一些類似ButterKnife等需要我們?cè)趏nCreate方法中去綁定的祖很,在onDestroy的時(shí)候我們都要進(jìn)行解綁操作。
當(dāng)我們調(diào)用finish()方法的時(shí)候我們會(huì)發(fā)現(xiàn)并不會(huì)立即執(zhí)行onDestroy的方法漾脂。執(zhí)行finish()方法的時(shí)候我們是將這個(gè)Activity從棧中移除了假颇,但是資源還沒有被釋放,當(dāng)資源釋放之后就會(huì)調(diào)用onDestroy方法了骨稿。
@Override
protected void onRestart() {
super.onRestart();
}
onRestart方法在生命周期中是不一定會(huì)調(diào)用到的方法笨鸡,常用的地方為當(dāng)用戶從A->B,再從B返回A的時(shí)候A就會(huì)調(diào)用onRestart方法姜钳,在onRestart方法中我們可以做一些事情,比如B的操作可能會(huì)引起A數(shù)據(jù)的變化形耗,那么我們可以在調(diào)用onRestart方法的時(shí)候去請(qǐng)求數(shù)據(jù)哥桥。
在從A跳轉(zhuǎn)到B的時(shí)候各個(gè)Activity的生命周期調(diào)用的順序
A Activity
@Override
protected void onPause() {
super.onPause();
}
B Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
A Activity
@Override
protected void onStop() {
super.onStop();
}
從B返回到A是各個(gè)Activity生命周期執(zhí)行的順序
B Activity
@Override
protected void onPause() {
super.onPause();
}
A Activity
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
B Activity
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
在橫豎屏切換的時(shí)候Activity的生命周期變化
1.豎>>>>>橫
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
2.橫>>>>>豎
與豎屏切橫屏執(zhí)行的生命周期方法一樣,只不過在橫屏切換到豎屏的時(shí)候執(zhí)行兩次生命周期方法
3.設(shè)置Activity的android:configChanges="orientation"時(shí)激涤,橫豎屏的切換都只執(zhí)行一次生命周期的方法
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged
4.設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí)拟糕,橫豎屏切換不會(huì)調(diào)用生命周期方法,只執(zhí)行onConfigurationChanged方法倦踢。
Framgent的使用對(duì)Activity的生命周期是否有影響
在Activity中調(diào)用Fragment不會(huì)影響到Activity的生命周期送滞,由于Fragment依附于Activity,所以Fragment的生命周期受到Activity的影響辱挥。并且Fragment的生命周期方法要比Activity多兩個(gè)方法犁嗅。具體是哪些方法下一篇再細(xì)說。
注:文中的圖片出處http://blog.csdn.net/liuhe688/article/details/6733407
PS:小伙伴們的關(guān)注與點(diǎn)贊是對(duì)我最大的支持晤碘,請(qǐng)用的鼠標(biāo)給我多一點(diǎn)支持吧褂微。