要想理解Activity的生命周期,必先理解Activity的狀態(tài)。
一、Activity狀態(tài)
Android官方文檔中把Activity分為下面三種狀態(tài):
1、Resumed(活動(dòng)狀態(tài))
或者叫Running狀態(tài),這個(gè)Activity正在屏幕上顯示,并且有用戶焦點(diǎn)。這個(gè)很好理解,就是用戶正在操作的那個(gè)界面。
2、Paused(暫停狀態(tài))
這是一個(gè)比較不常見(jiàn)的狀態(tài)。這個(gè)Activity在屏幕上是可見(jiàn)的,但是并不是在屏幕最前端的那個(gè)Activity。比如有另一個(gè)非全屏或者透明的Activity是Resumed狀態(tài),沒(méi)有完全遮蓋這個(gè)Activity。
比如下面這個(gè)情況,SecondActivity是Resumed狀態(tài),但是并未完全覆蓋MainActivity,此時(shí)MainActivity就是Paused狀態(tài)。

3、Stopped(停止?fàn)顟B(tài))
當(dāng)Activity完全不可見(jiàn)時(shí),此時(shí)Activity還在后臺(tái)運(yùn)行,仍然在內(nèi)存中保留Activity的狀態(tài),并不是完全銷毀。
這個(gè)也很好理解,當(dāng)跳轉(zhuǎn)的另外一個(gè)界面,之前的界面還在后臺(tái),按回退按鈕還會(huì)恢復(fù)原來(lái)的狀態(tài),大部分軟件在打開(kāi)的時(shí)候,直接按Home鍵,并不會(huì)關(guān)閉它,此時(shí)的Activity就是Stopped狀態(tài)。
二、Activity生命周期
和Activity生命周期相關(guān)的方法有下面幾個(gè):
onCreate(Bundle savedInstanceState)
onStart()
onRestart()
onResume()
onPause()
onStop()
onDestroy()
相對(duì)來(lái)說(shuō)方法數(shù)量比較多,初學(xué)者理解起來(lái)比較困難。
Android官方文檔中把Activity生命周期分為三個(gè)區(qū)間:
1、The entire lifetime(整個(gè)生命周期)
是指在onCreate()和onDestroy()之間的周期。
一個(gè)人的一生,就是從出生開(kāi)始,到死亡的這段時(shí)間。Activity生命周期也是一樣,從Create開(kāi)始,直到Destroy,二者在整個(gè)生命周期都只有一次。當(dāng)用戶新打開(kāi)一個(gè)界面,此時(shí)會(huì)調(diào)用onCreate(),當(dāng)用戶關(guān)閉這個(gè)界面,例如按返回鍵,此時(shí)Activity就完全銷毀,此時(shí)會(huì)調(diào)用onDestroy()。
這個(gè)周期之間包含上面所說(shuō)的全部狀態(tài):Resumed、Paused、Stopped。
2、The visible lifetime(可見(jiàn)的生命周期)
是指在onStart()和onStop()之間的周期,包含在The entire lifetime
之中。在整個(gè)生命周期中可能會(huì)有多次。
這段周期包含Resumed、Paused兩種狀態(tài),即兩種Activity可見(jiàn)的狀態(tài)。
當(dāng)Activity會(huì)變?yōu)镾topped狀態(tài),例如在新的Activity覆蓋掉原來(lái)的Activity時(shí),會(huì)調(diào)用onStop()方法,重新回到原來(lái)的Activity時(shí),又會(huì)調(diào)用onStart()。
3、The foreground lifetime(活動(dòng)生命周期)
是指在onResume()和onPause()之間的周期,包含在The visible lifetime之中。在The visible lifetime中可能會(huì)有多次。
這段周期只包含Resumed一種狀態(tài),即前端獲取焦點(diǎn)用戶可操作的狀態(tài)。
當(dāng)Activity變?yōu)镽esumed狀態(tài),會(huì)調(diào)用onResume()方法,反之會(huì)調(diào)用onPause()方法。
說(shuō)到這里,還漏了一個(gè)onRestart(),很簡(jiǎn)單,Activity第一次onStart()會(huì)在onCreate()之后,如果在整個(gè)生命周期中再次onStart(),那么調(diào)用onStart()之前會(huì)調(diào)用onRestart()。
下面分別來(lái)進(jìn)行上面三者的實(shí)驗(yàn):
MainActivity界面上有兩個(gè)按鈕,分別是打開(kāi)SecondActivity和ThirdActivity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/secondActivityButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="打開(kāi)SecondActivity"/> <Button android:id="@+id/thirdActivityButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="打開(kāi)ThirdActivity"/> </LinearLayout>

在MainActivity.java中,重寫(xiě)生命周期相關(guān)方法,加上日志:
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initEvent(); Log.v(TAG, "onCreate"); } @Override protected void onStart() { super.onStart(); Log.v(TAG, "onStart"); } @Override protected void onRestart() { super.onRestart(); Log.v(TAG, "onRestart"); } @Override protected void onResume() { super.onResume(); Log.v(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.v(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.v(TAG, "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.v(TAG, "onDestroy"); } private void initEvent() { // 點(diǎn)擊打開(kāi)SecondActivity Button secondActivityButton = (Button) findViewById(R.id.secondActivityButton); secondActivityButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); // 點(diǎn)擊打開(kāi)ThirdActivity Button thirdActivityButton = (Button) findViewById(R.id.thirdActivityButton); thirdActivityButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, ThirdActivity.class); startActivity(intent); } }); } }
Second分別是兩個(gè)測(cè)試Activity,代碼和xml這里不再貼出來(lái)了。
最后AndroidManifest.xml:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="com.example.app012.MainActivity" android:label="MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.app012.SecondActivity" android:label="SecondActivity" > </activity> <activity android:name="com.example.app012.ThirdActivity" android:label="ThirdActivity" android:theme="@android:style/Theme.Dialog"> </activity> </application>
這里SecondActivity是一個(gè)普通的Activity,ThirdActivity設(shè)置android:theme="@android:style/Theme.Dialog",表示它顯示為一個(gè)對(duì)話框,打開(kāi)ThirdActivity不會(huì)完全覆蓋MainActivity狀態(tài),是用來(lái)實(shí)驗(yàn)MainActivity的Paused狀態(tài)的。
實(shí)驗(yàn)步驟:
1、
在模擬器中運(yùn)行程序,此時(shí)日志:
onCreate
onStart
onResume
再按返回鍵退出程序:
onPause
onStop
onDestroy
上面模擬了The entire lifetime整個(gè)生命周期,剛打開(kāi)程序時(shí)onCreate到Activity銷毀onDestroy。
2、
打開(kāi)程序后,按“打開(kāi)SecondActivity”按鈕:
onPause
onStop
再按返回鍵回到MainActivity:
onRestart
onStart
onResume
再按Home鍵回到桌面:
onPause
onStop
再打開(kāi)程序:
onRestart
onStart
onResume
以上模擬The visible lifetime,當(dāng)MainActivity轉(zhuǎn)到后臺(tái)不可見(jiàn)時(shí)調(diào)用onStop,再次可見(jiàn)時(shí)onStart,由于是再次可見(jiàn),會(huì)調(diào)用onRestart。
3、
打開(kāi)程序后,按“打開(kāi)ThirdActivity”按鈕:
onPause
此時(shí)MainActivity沒(méi)有完全被覆蓋:
再按返回鍵:
onResume
上面模擬The foreground lifetime,失去焦點(diǎn)后onPause,重新得到焦點(diǎn)后onResume。
通過(guò)上面實(shí)驗(yàn),可以看出:
The foreground lifetime(onResume到onPause)包含在Thevisible lifetime(onStart到onStop)之中,The visible lifetime包含在The entire lifetime(onCreate到onDestroy)之中。
作者:叉叉哥 轉(zhuǎn)載請(qǐng)注明出處:
http://blog.csdn.net/xiao__gui/article/details/11464603
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
