Activity的生命周期

一 、概述

當(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í)行生命周期流程圖

activity生命周期圖

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***

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

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

  • 啟動(dòng)與銷(xiāo)毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例,Android 系統(tǒng)會(huì)通過(guò)調(diào)用對(duì)...
    安卓Boy閱讀 1,877評(píng)論 3 5
  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶(hù)在使用應(yīng)用時(shí)接聽(tīng)來(lái)電或切換到另一個(gè)應(yīng)用,它不會(huì)崩潰。 2....
    正陽(yáng)Android閱讀 602評(píng)論 1 0
  • 一本android開(kāi)發(fā)程序員必讀的一本書(shū),感謝任玉剛大佬的分享 一、Activity的生命周期全面分析 典型情況下...
    kongjn閱讀 632評(píng)論 1 3
  • 之前學(xué)習(xí)安卓的時(shí)候只是知道生命周期是什么,有哪幾個(gè),但具體的詳細(xì)的東西卻不知道,后來(lái)看過(guò)《Android開(kāi)發(fā)藝術(shù)探...
    這是朕的江山閱讀 105,627評(píng)論 19 84
  • 一、Activity的生命周期 1.Activity生命周期中的重要方法 (1)、onCreate():表示Act...
    Felix_Zhou閱讀 855評(píng)論 0 3

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