欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開(kāi)發(fā)Activity的生命周期詳解

 更新時(shí)間:2022年07月28日 14:34:39   作者:程序遇上智能星空  
這篇文章主要介紹了Android開(kāi)發(fā)Activity的生命周期詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參一下

前言

Android生命周期分為兩部分: 

  • (1)典型情況下的生命周期
  • (2)異常情況下的生命周期。

典型情況下的生命周期分析

圖1 Activity的生命周期圖解

圖2 Activity生命周期的金字塔圖 

(1)典型情況下的生命周期指在有用戶參與的情況下,Activity所經(jīng)過(guò)的生命周期的改變,正常情況下,Activity的常用生命周期有以下幾種情況:

  • onCreate():Activity啟動(dòng)后第一個(gè)被調(diào)用的函數(shù),常用來(lái)進(jìn)行Activity的初始化,如創(chuàng)建View,綁定數(shù)據(jù)和恢復(fù)數(shù)據(jù)。
  • onStart():當(dāng)Activity顯示在屏幕上時(shí),函數(shù)被調(diào)用。
  • onRestart():Activity從停止?fàn)顟B(tài)進(jìn)入活動(dòng)狀態(tài)是調(diào)用。
  • onResume():Activity可以接受用戶輸入時(shí),該函數(shù)被調(diào)用,此時(shí)的activity位于activity棧的棧頂。
  • onPause():當(dāng)Activity進(jìn)入暫停狀態(tài)時(shí),該函數(shù)被調(diào)用,一般用來(lái)保存持久的數(shù)據(jù)或釋放占用的資源。
  • onStop():當(dāng)Activity變?yōu)椴豢梢?jiàn)后,該函數(shù)被調(diào)用,Activity進(jìn)入停止?fàn)顟B(tài)。
  • onDestroy():在Activity被終止前,被調(diào)用。
/*1.onCreate:
    每個(gè)Activity在寫代碼的過(guò)程中都會(huì)看見(jiàn)這個(gè)函數(shù),
    是聲明周期的第一個(gè)方法。
    一般做一些資源和數(shù)據(jù)初始化的工作,
    比如綁定相對(duì)應(yīng)的資源布局setContentView*/
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
/*2.onRestart:
    字面意思表示Activity重新啟動(dòng),這個(gè)狀態(tài)一般由用戶切換應(yīng)用的行為產(chǎn)生,
    比如從應(yīng)用切換到桌面或者切打開(kāi)新的Activity,
    此時(shí)這個(gè)Activity就會(huì)調(diào)用onPause和onStop讓這個(gè)Activity進(jìn)入展廳狀態(tài)。
    再回到這個(gè)Activity就是onRestart了*/
        @Override
    protected void onRestart() {
        super.onRestart();
    }
/*3.onStart:
    這個(gè)狀態(tài)我理解就是Activity啟動(dòng)中的一個(gè)過(guò)程,
    就是啟動(dòng)中,但是還不能與用戶交互(用戶不可見(jiàn)),
    屬于一個(gè)在后臺(tái)的狀態(tài)*/
        @Override
    protected void onStart() {
        super.onStart();
    }
/*4.onResume:
    表示Activity已經(jīng)可見(jiàn),且已經(jīng)開(kāi)始活動(dòng)。
    與onStart類似的狀態(tài)但是就是屬于一種在前臺(tái)的狀態(tài)*/
        @Override
    protected void onResume() {
        super.onResume();
    }
/*5.onPause:
    是一個(gè)非常微妙的狀態(tài),處于正在停止的一個(gè)臨界點(diǎn),
    就很難重現(xiàn)這種狀態(tài),就是在停止過(guò)程中,
    先執(zhí)行onPause然后在onStop執(zhí)行之前,
    回到Activity執(zhí)行onResume,這期間就是onPause的狀態(tài)。
    此處可以做一些存儲(chǔ)數(shù)據(jù)停止動(dòng)畫的工作,但是不能太耗時(shí),
    不然會(huì)影響到新Activity的顯示,只有這些操作做完,
    新Activity的OnResume才會(huì)執(zhí)行。*/
        @Override
    protected void onPause() {
        super.onPause();
    }
/*6.onStop:
    表示Activity即將停止,可以做一些相對(duì)重量級(jí)的回收工作,
    同樣不能太耗時(shí)。*/
    @Override
    protected void onStop() {
        super.onStop();
    }
/*onDestroy
    表示Activity即將被銷毀,這是Activity生命的盡頭,
    可以做一些回收工作和資源的釋放。*/
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

(2)進(jìn)一步地,可以將Activity分為3種生存期:

  • 完整生存期:在 onCreate() 和 onDestroy() 之間所經(jīng)歷的。
  • 可見(jiàn)生存期:在 onStart() 和 onStop() 之間所經(jīng)歷的。
  • 前臺(tái)生存期:在 onResume() 和 onPause() 之間所經(jīng)歷的。

(3)Activity的活動(dòng)狀態(tài)

  • 運(yùn)行狀態(tài):位于返回棧棧頂?shù)幕顒?dòng)。
  • 暫停狀態(tài):不在棧頂位置,但仍然可見(jiàn)。
  • 停止?fàn)顟B(tài):不在棧頂位置,完全不可見(jiàn)??赡軙?huì)被系統(tǒng)回收。
  • 銷毀狀態(tài):在返回棧中移除的活動(dòng)。

(返回棧:每啟動(dòng)一個(gè)新的活動(dòng),會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢?。每銷毀一個(gè)活動(dòng),處于棧頂?shù)幕顒?dòng)會(huì)出棧,前一個(gè)入棧的活動(dòng)會(huì)重新處于棧頂?shù)奈恢?。?/p>

異常情況下的生命周期分析 (1)系統(tǒng)配置發(fā)生改變引起生命周期的異常變化

舉例:開(kāi)啟手機(jī)的自動(dòng)旋轉(zhuǎn)后,當(dāng)Activity從豎屏狀態(tài)轉(zhuǎn)變?yōu)闄M屏?xí)r,系統(tǒng)會(huì)自動(dòng)銷毀原先的Activity并重建。如果不做特殊處理,那么每當(dāng)系統(tǒng)配置改變時(shí),Activity都會(huì)銷毀重建,

如圖所示:

圖3 旋轉(zhuǎn)手機(jī)時(shí)Activity的生命周期變化情況

當(dāng)手機(jī)從豎屏轉(zhuǎn)變?yōu)闄M屏?xí)r,可以看到原Activity執(zhí)行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。當(dāng)原Activity銷毀后又會(huì)迅速的開(kāi)啟新的Activity執(zhí)行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最終新的Activity顯示在用戶界面上。onSaveInstanceState 和 onRestoreInstanceState 兩個(gè)方法僅在生命周期異常情況下執(zhí)行。onSaveInstanceState主要是對(duì)異常銷毀的Activity進(jìn)行數(shù)據(jù)保存,onRestoreInstanceState主要是對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行恢復(fù),數(shù)據(jù)存取都是通過(guò)Bundle,因此我們可以在Bundle中附加個(gè)人數(shù)據(jù)進(jìn)行讀寫。經(jīng)過(guò)測(cè)試onSaveInstanceState在onStop前調(diào)用,onRestoreInstanceState在onStart方法后調(diào)用。這兩個(gè)方法執(zhí)行的過(guò)程中,系統(tǒng)會(huì)自動(dòng)對(duì)視圖進(jìn)行信息數(shù)據(jù)的存取,例如:ListView的滾動(dòng)位置等等。(2)資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死

當(dāng)系統(tǒng)資源不足時(shí),系統(tǒng)會(huì)按照上述優(yōu)先級(jí)去殺死目標(biāo)的 Activity 所在的進(jìn)程,并在后續(xù)通過(guò) onSaveInstanceState 和 onRestoreInstanceState 來(lái)存儲(chǔ)和恢復(fù)數(shù)據(jù)。如果一些后臺(tái)的進(jìn)程脫離了四大組件而獨(dú)立運(yùn)行,那么這個(gè)進(jìn)程很快就被殺死。我們常常將后臺(tái)工作放到 Service 中保持進(jìn)程具有一定的優(yōu)先級(jí)。

圖4 configChanges添加orientation后的效果

當(dāng)系統(tǒng)配置改變時(shí)Activity會(huì)銷毀重建,通過(guò)在AndroidMainManifest.xml中為Activity添加configChanges屬性去避免這個(gè)情況。configChanges的屬性有很多,例如:orientation表示屏幕方向變化、KeyboardHidden表示虛擬鍵盤可訪問(wèn)性變化等,通過(guò)設(shè)置這些屬性后當(dāng)運(yùn)行過(guò)程中發(fā)生上述情況Activity既不會(huì)銷毀重建也不會(huì)調(diào)用 onSaveInstanceState 和 onRestoreInstanceState 兩個(gè)方法,而是執(zhí)行onConfigChanged方法。

問(wèn)題: (1)onStart 和 onResume、onPause 和 onStop 從功能描述上看大同小異,到底有什么區(qū)別呢?

這兩組方法對(duì)的回調(diào)意義不同,onState 和onStop 是從 Activity 是否可見(jiàn)這個(gè)角度來(lái)回調(diào)的,而 onResume 和 onPause 是從 Activity 是否位于前臺(tái)這個(gè)角度來(lái)回調(diào)的,不過(guò)在實(shí)際使用中沒(méi)有其他明顯區(qū)別。

(2)假設(shè)當(dāng)前Activity為A,如果這時(shí)用戶打開(kāi)了一個(gè)新的Activity B,那么B的onResume方法和A的onPause方法誰(shuí)先執(zhí)行呢?

根據(jù)Android的基本運(yùn)行機(jī)制,不能在onPause中執(zhí)行重量級(jí)的操作,因?yàn)楸仨歰nPause執(zhí)行完成以后新Activity才能onResume。onPause和onResume都不能執(zhí)行耗時(shí)的操作,尤其是onPause,這就意味著我們應(yīng)該在onStop中操作,從而使新的Activity顯示出來(lái)并切換到前臺(tái)。

到此這篇關(guān)于Android開(kāi)發(fā)Activity的生命周期詳解的文章就介紹到這了,更多相關(guān)Android Activity 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論