Android之Activity生命周期總結(jié)(一)

Activity作為四大組件之一,是使用頻率最高的組件,也是直接為用戶提供主體的操作主件,基本上我們在Android的各個地方都能看見它的蹤影,因此深入了解Activity,對于開發(fā)Android應(yīng)用程序是非常必要的,通過最近對Android的學(xué)習(xí)加之自己的理解進(jìn)行一下總結(jié)。

一、??Activity的形態(tài)

Active/Running:

Activity此時是可見可交互的形態(tài),此時Activity處于棧頂。

Paused:

當(dāng)Activity失去焦點(diǎn),或者在此Activity中打開一個新的非全屏的Activity,或者一個透明的Activity,此時原來的Activity被新的Activity占據(jù)了棧頂?shù)奈恢?,原Activity就轉(zhuǎn)化為Paused狀態(tài)。但此時Activity只是失去了與用戶交互的能力,Activity是可見的狀態(tài),其所有的狀態(tài)信息及其成員變量都還存在,只有在系統(tǒng)內(nèi)存緊張的情況下,才有可能被系統(tǒng)回收掉。

Stopped:

當(dāng)一個Activity被另一個Activity完全覆蓋時,被覆蓋的Activity就會進(jìn)入Stopped狀態(tài),此時它不可見,但是跟Paused狀態(tài)一樣保持著其所有狀態(tài)信息及其成員變量,只有在系統(tǒng)內(nèi)存緊張的情況下,才有可能被系統(tǒng)回收掉。

Killed:

當(dāng)Activity被系統(tǒng)回收掉時,Activity就處于Killed狀態(tài)。

二、Activity經(jīng)典的生命周期圖:

以下是官方最新給出的Activity生命周期圖:

從這兩張生命周期圖中我們可以看到,Activity的生命周期有7個(當(dāng)然完全的生命周期不止7個方法,還有些方法是特定的情境中才會被調(diào)用,這里說的是正常的生命周期的方法數(shù)是7個,之后會另外說其他情景中的生命周期)。

onCreate : 在Activity被創(chuàng)建時調(diào)用,它是生命周期第一個調(diào)用的方法,在此方法中我們可以做一些初始化的操作,如通過setContentView設(shè)置界面布局的資源,初始化所需要的組件信息等,但是在此要注意的是,在onCreate()中不可以彈出dialog或者popupwindow。

onStart :

此時Activity正在啟動,Activity已經(jīng)處于可見狀態(tài),但是尚未顯示,且無法與用戶交互。(PS曾經(jīng)有面試官問生命周期的時候,有這么個附加的問題,就是啟動Activity時onCreate之后必定會onStart,那怎么才能不讓onStart被調(diào)用呢?答案其實(shí)很簡單,那就在OnCreate中讓它死掉好了^_

^)

onResume :

此時Activity已在前臺可見,可與用戶交互(處于前面所說的Active/Running形態(tài)),onResume方法與onStart的相同點(diǎn)是兩者都表示Activity可見,只不過onStart回調(diào)時Activity還是后臺無法與用戶交互,而onResume可與用戶交互。從流程圖我們可以看出當(dāng)Activity停止后(onPause方法和onStop方法被調(diào)用),重新回到前臺時也會調(diào)用onResume方法,因此我們也可以在onResume方法中初始化一些資源,或者加載之前停止時保存的資源。比如重新初始化在onPause或者onStop方法中釋放的資源。

onPause :

此時Activity正在停止(Paused形態(tài)),一般情況下onStop方法會緊接著被回調(diào)。但通過流程圖我們還可以看到一種情況是onPause方法執(zhí)行后直接執(zhí)行了onResume方法,這屬于比較極端的現(xiàn)象了,這可能是用戶操作使當(dāng)前Activity退居后臺后又迅速地再回到到當(dāng)前的Activity,此時onResume方法就會被回調(diào)。當(dāng)然,在onPause方法中我們可以做一些數(shù)據(jù)存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因?yàn)檫@可能會影響到新的Activity的顯示——onPause方法執(zhí)行完成后,新Activity的onResume方法才會被執(zhí)行。

onStop:當(dāng)這個Activity不在顯示給用戶時調(diào)用,因?yàn)榱硪粋€Activity已經(jīng)被恢復(fù)(resumed)并且已經(jīng)覆蓋了它,這可能出現(xiàn)在一個新的Activity正在被啟動,或另一個存在的Activity要獲得焦點(diǎn),來到前臺界面,又或者這個Activity將要被銷毀。跟在它后面的通常有兩種方法,如果這個Activity回到前臺與用戶進(jìn)行交互,那么就是onRestart方法,如果這個Activity將要被銷毀,則它后面的方法就是onDestroy。

onRestart

:表示Activity正在重新啟動,當(dāng)Activity由不可見變?yōu)榭梢姞顟B(tài)時,該方法被回調(diào)。這種情況一般是用戶打開了一個新的Activity時,當(dāng)前的Activity就會被暫停(onPause和onStop被執(zhí)行了),接著又回到當(dāng)前Activity頁面時,onRestart方法就會被回調(diào)。

onDestroy :此時Activity正在被銷毀,也是生命周期最后一個執(zhí)行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

下面通過例子來看Activity的生命周期的歷程:

代碼如下:

[java]view plaincopy

publicclassNormalLifeCycleActivityextendsActivity{

privatefinalString?TAG="NormalLifeCycleActivity";

/**

*

*?@param?savedInstanceState

*/

@Override

protectedvoidonCreate(@NullableBundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main2);

findViewById(R.id.tonext).setOnClickListener(newView.OnClickListener()?{

@Override

publicvoidonClick(View?view)?{

startActivity(newIntent(NormalLifeCycleActivity.this,NormalLifeCycleOtherActivity.class));

}

});

Log.v(TAG,"onCreate被調(diào)用");

}

@Override

protectedvoidonStart()?{

super.onStart();

Log.v(TAG,"onStart被調(diào)用");

}

@Override

protectedvoidonResume()?{

super.onResume();

Log.v(TAG,"onResume被調(diào)用");

}

@Override

protectedvoidonPause()?{

super.onPause();

Log.v(TAG,"onPause被調(diào)用");

}

@Override

protectedvoidonRestart()?{

super.onRestart();

Log.v(TAG,"onRestart被調(diào)用");

}

@Override

protectedvoidonStop()?{

super.onStop();

Log.v(TAG,"onStop被調(diào)用");

}

@Override

protectedvoidonDestroy()?{

super.onDestroy();

Log.v(TAG,"onDestroy被調(diào)用");

}

}

Activity啟動過程中所調(diào)用的生命周期方法,運(yùn)行程序截圖如下:

從日志中可以看出Activity啟動后,先調(diào)用了onCreate方法,然后是onStart方法,最后是onResume方法,進(jìn)入運(yùn)行狀態(tài),此時Activity已在前臺顯示。因此,

Activity啟動–>onCreate()–>onStart()–>onResume()依次被調(diào)用。

當(dāng)前Activity創(chuàng)建完成后,按Home鍵回到主屏。按如上操作運(yùn)行截圖:

在Activity創(chuàng)建完成后,點(diǎn)擊Home回調(diào)主界面時,此時onPause方法和onStop方法被執(zhí)行,也就是點(diǎn)擊Home鍵回到主界面–>onPause()–>onStop()依次被調(diào)用

當(dāng)我們在原有的Activity的基礎(chǔ)上啟動新的Activity時,調(diào)用結(jié)果如下:

我們可看到原來的Activity調(diào)用的了onPause方法和onStop方法。也就是說

在原Activity的基礎(chǔ)上開啟新的Activity,原Activity生命周期執(zhí)行方法順序?yàn)楱C>onPause()–>onStop(),事實(shí)上跟點(diǎn)擊home鍵是一樣的。但是這里有點(diǎn)要注意的是如果新的Activity使用了透明主題,那么當(dāng)前Activity不會回調(diào)onStop方法。

當(dāng)我們點(diǎn)擊Back鍵回退時,回調(diào)結(jié)果如下:

從Log我們可以看出,當(dāng)點(diǎn)擊Back鍵回退時,相當(dāng)于退出了當(dāng)前Activity,Activity將被銷毀,因此

退出當(dāng)前Activity時–>onPause()–>onStop()–>onDestroy()依次被調(diào)用。

總結(jié):當(dāng)Activity啟動時,依次會調(diào)用onCreate(),onStart(),onResume(),而當(dāng)Activity退居后臺時(不可見,點(diǎn)擊Home或者被新的Activity完全覆蓋),onPause()和onStop()會依次被調(diào)用。當(dāng)Activity重新回到前臺(從桌面回到原Activity或者被覆蓋后又回到原Activity)時,onRestart(),onStart(),onResume()會依次被調(diào)用。當(dāng)Activity退出銷毀時(點(diǎn)擊back鍵),onPause(),onStop(),onDestroy()會依次被調(diào)用,到此Activity的整個生命周期方法回調(diào)完成。,這就是Activity整個典型的生命周期過程。下篇我們開說一下Activity的異常生命周期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容