一 、概述
當(dāng)用戶(hù)在系統(tǒng)與你的應(yīng)用之間切換的過(guò)程中,你的應(yīng)用中的Activity實(shí)例也會(huì)在自己的不同生命周期中切換。例如,用戶(hù)第一次打開(kāi)你的應(yīng)用,應(yīng)用展現(xiàn)在用戶(hù)的手機(jī)桌面,獲取用戶(hù)的輸入焦點(diǎn)。在這個(gè)過(guò)程中,Android系統(tǒng)調(diào)用了你的Activity中的一系列的生命周期方法,這些方法建立了應(yīng)用組建和用戶(hù)之間的聯(lián)系。如果用戶(hù)啟動(dòng)了應(yīng)用中的另外一個(gè)Activity,或者直接切換到另外一個(gè)應(yīng)用,系統(tǒng)也調(diào)用了Activity生命周期中的一系列方法使應(yīng)用可以在后臺(tái)運(yùn)行。
ps:下圖為activity執(zhí)行生命周期流程圖

ps:如果你想詳細(xì)了解activity的生命周期,下面是Android官網(wǎng)鏈接https://developer.android.com/intl/zh-cn/guide/components/activities.html
二 、方法
onCreate()
當(dāng)Acitivity第一次被創(chuàng)建時(shí)觸發(fā),一般在這里要做的事情包括創(chuàng)建視圖(setContentView()),最重要是在里面調(diào)用setContentView,還可以在里面初始化各控件、設(shè)置監(jiān)聽(tīng)、并初始化一些全局的變量。因?yàn)樵贏(yíng)ctivity的一次生命周期中,onCreate方法只會(huì)執(zhí)行一次。在Paused和Stopped狀態(tài)下恢復(fù)或重啟的下,這些控件、監(jiān)聽(tīng)和全局變量也不會(huì)丟失。即便是內(nèi)存不足,被回收了,再次Recreate的話(huà),又是一次新的生命周期的開(kāi)始,又會(huì)執(zhí)行onCreate方法。還可以在onCreate執(zhí)行數(shù)據(jù)操作,比如從Cursor中檢索數(shù)據(jù)等等,但是如果你每次進(jìn)入這個(gè)Activity都可能需要更新數(shù)據(jù),那么最好放在onStart里面。
onRestart()
這個(gè)我比較少用到,按文檔上的介紹,如果Activity之前被stop過(guò),那么下一次onStart()方法之前會(huì)先觸發(fā)這個(gè)方法。
onStart()
只要Activity從不可見(jiàn)變成可見(jiàn),就會(huì)觸發(fā)到這個(gè)方法,但被AlertDialog遮擋/顯示的情況不算在內(nèi)。
onResume()
當(dāng)Activity來(lái)到最上層的時(shí)候,也就是開(kāi)始與用戶(hù)直接交互時(shí),觸發(fā)這個(gè)方法。例如本來(lái)Activity被一個(gè)AlertDialog遮擋,當(dāng)這個(gè)AlertDialog消失時(shí),onResume()方法就被觸發(fā)。
onPause()
onPause()和onResume()的觸發(fā)條件剛好相反,如果Activity本來(lái)在最上層,當(dāng)它要讓出最上層的位置時(shí)會(huì)觸發(fā)這個(gè)方法。onPause()和onResume()
是被觸發(fā)最頻繁的兩個(gè)方法,所以在這里不應(yīng)該執(zhí)行過(guò)于消耗資源的方法。
onStop()
當(dāng)有其他Activity覆蓋了當(dāng)前Activity時(shí),不論另一個(gè)Activity是新開(kāi)始的還是從下層移至最上層的,當(dāng)前Activity的onStop()方法都會(huì)被觸發(fā)。
onDestroy()
Activity生命周期的終點(diǎn)。有兩種情況會(huì)導(dǎo)致它被觸發(fā):1)執(zhí)行了Activity#finish()方法;2)Android系統(tǒng)由于資源不足等原因決定殺掉Activity所在進(jìn)程。通過(guò)isFinishing()方法可以判斷出是哪種情況。在這個(gè)方法里,我們一般要做的事情是釋放Activity占有的資源,例如后臺(tái)正在進(jìn)行的下載線(xiàn)程等等。
三 、實(shí)例代碼
我們來(lái)做一個(gè)簡(jiǎn)單的代碼,看看activity在A(yíng) B兩個(gè)界面中跳轉(zhuǎn)是如果執(zhí)行這些方法的在A(yíng)的activity中有一個(gè)按鈕,點(diǎn)擊之后會(huì)跳轉(zhuǎn)到B的activity中然后,我們?cè)僭贐的activity中點(diǎn)擊手機(jī)上面的物理按鍵中的返回鍵,看看這兩個(gè)activity都執(zhí)行了什么樣的方法,以及他們執(zhí)行的順序是什么樣的。
A activity的代碼
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("A--------" + "onCreate");
findViewById(R.id.bun).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Main2Activity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
System.out.println("A--------" + "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("A--------" + "onRestart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("A--------" + "onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("A--------" + "onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("A--------" + "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("A--------" + "onDestroy");
}
}
B activity的代碼
public class Main2Activity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
System.out.println("B--------" + "onCreate");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("B--------" + "onRestart");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("B--------" + "onStart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("B--------" + "onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("B--------" + "onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("B--------" + "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("B--------" + "onDestroy");
}
}
那么到此,我們可以清楚的看到下面執(zhí)行打印的結(jié)果,值得提醒的是,如果你的手機(jī)中在 開(kāi)發(fā)者選項(xiàng)中開(kāi)啟了 不保留活動(dòng)設(shè)置的話(huà),那就是用戶(hù)離開(kāi)后銷(xiāo)毀每一個(gè)activity,所以當(dāng)用戶(hù)離開(kāi)A后,肯定也會(huì)執(zhí)行onDestroy方法
當(dāng)我們初次啟動(dòng)A界面的時(shí)候執(zhí)行的方法
05-07 15:09:50.796 26398-26398/com.wlj.demo1 I/System.out: A--------onCreate
05-07 15:09:50.798 26398-26398/com.wlj.demo1 I/System.out: A--------onStart
05-07 15:09:50.799 26398-26398/com.wlj.demo1 I/System.out: A--------onResume
點(diǎn)擊了界面上的按鈕,開(kāi)始跳轉(zhuǎn)到B界面中執(zhí)行的方法
點(diǎn)擊了界面上的按鈕,開(kāi)始跳轉(zhuǎn)到B界面中執(zhí)行的方法
05-07 15:11:11.927 26398-26398/com.wlj.demo1 I/System.out: A--------onPause
05-07 15:11:11.967 26398-26398/com.wlj.demo1 I/System.out: B--------onCreate
05-07 15:11:11.968 26398-26398/com.wlj.demo1 I/System.out: B--------onStart
05-07 15:11:11.969 26398-26398/com.wlj.demo1 I/System.out: B--------onResume
05-07 15:11:12.394 26398-26398/com.wlj.demo1 I/System.out: A--------onStop
在B界面按下返回鍵執(zhí)行了方法
在B界面按下返回鍵執(zhí)行了方法
05-07 15:11:15.001 26398-26398/com.wlj.demo1 I/System.out: B--------onPause
05-07 15:11:15.019 26398-26398/com.wlj.demo1 I/System.out: A--------onRestart
05-07 15:11:15.021 26398-26398/com.wlj.demo1 I/System.out: A--------onStart
05-07 15:11:15.021 26398-26398/com.wlj.demo1 I/System.out: A--------onResume
05-07 15:11:15.431 26398-26398/com.wlj.demo1 I/System.out: B--------onStop
05-07 15:11:15.431 26398-26398/com.wlj.demo1 I/System.out: B--------onDestroy
ps:以上這些就是簡(jiǎn)單的對(duì)activity生命周期的梳理,歡迎指正。
*** 個(gè)人主頁(yè):http://www.wanglijun.vip***
*** csdn主頁(yè):http://blog.csdn.net/mynamelijun***
*** 簡(jiǎn)書(shū)主頁(yè):http://www.itdecent.cn/users/b6cc5e05848d/latest_articles***