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

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

一、??Activity的形態

Active/Running:

Activity此時是可見可交互的形態,此時Activity處于棧頂。

Paused:

當Activity失去焦點,或者在此Activity中打開一個新的非全屏的Activity,或者一個透明的Activity,此時原來的Activity被新的Activity占據了棧頂的位置,原Activity就轉化為Paused狀態。但此時Activity只是失去了與用戶交互的能力,Activity是可見的狀態,其所有的狀態信息及其成員變量都還存在,只有在系統內存緊張的情況下,才有可能被系統回收掉。

Stopped:

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

Killed:

當Activity被系統回收掉時,Activity就處于Killed狀態。

二、Activity經典的生命周期圖:

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

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

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

onStart :

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

^)

onResume :

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

onPause :

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

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

onRestart

:表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回調。

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

下面通過例子來看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被調用");

}

@Override

protectedvoidonStart()?{

super.onStart();

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

}

@Override

protectedvoidonResume()?{

super.onResume();

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

}

@Override

protectedvoidonPause()?{

super.onPause();

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

}

@Override

protectedvoidonRestart()?{

super.onRestart();

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

}

@Override

protectedvoidonStop()?{

super.onStop();

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

}

@Override

protectedvoidonDestroy()?{

super.onDestroy();

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

}

}

Activity啟動過程中所調用的生命周期方法,運行程序截圖如下:

從日志中可以看出Activity啟動后,先調用了onCreate方法,然后是onStart方法,最后是onResume方法,進入運行狀態,此時Activity已在前臺顯示。因此,

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

當前Activity創建完成后,按Home鍵回到主屏。按如上操作運行截圖:

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

當我們在原有的Activity的基礎上啟動新的Activity時,調用結果如下:

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

在原Activity的基礎上開啟新的Activity,原Activity生命周期執行方法順序為–>onPause()–>onStop(),事實上跟點擊home鍵是一樣的。但是這里有點要注意的是如果新的Activity使用了透明主題,那么當前Activity不會回調onStop方法。

當我們點擊Back鍵回退時,回調結果如下:

從Log我們可以看出,當點擊Back鍵回退時,相當于退出了當前Activity,Activity將被銷毀,因此

退出當前Activity時–>onPause()–>onStop()–>onDestroy()依次被調用。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容