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的異常生命周期。