日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android開發Activity的生命周期詳解_Android

作者:程序遇上智能星空 ? 更新時間: 2022-09-21 編程語言

前言

Android生命周期分為兩部分:?

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

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

圖1 Activity的生命周期圖解

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

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

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

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

  • 完整生存期:在 onCreate() 和 onDestroy() 之間所經歷的。
  • 可見生存期:在 onStart() 和 onStop() 之間所經歷的。
  • 前臺生存期:在 onResume() 和 onPause() 之間所經歷的。

(3)Activity的活動狀態

  • 運行狀態:位于返回棧棧頂的活動。
  • 暫停狀態:不在棧頂位置,但仍然可見。
  • 停止狀態:不在棧頂位置,完全不可見。可能會被系統回收。
  • 銷毀狀態:在返回棧中移除的活動。

(返回棧:每啟動一個新的活動,會在返回棧中入棧,并處于棧頂的位置。每銷毀一個活動,處于棧頂的活動會出棧,前一個入棧的活動會重新處于棧頂的位置。)

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

舉例:開啟手機的自動旋轉后,當Activity從豎屏狀態轉變為橫屏時,系統會自動銷毀原先的Activity并重建。如果不做特殊處理,那么每當系統配置改變時,Activity都會銷毀重建,

如圖所示:

圖3 旋轉手機時Activity的生命周期變化情況

當手機從豎屏轉變為橫屏時,可以看到原Activity執行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。當原Activity銷毀后又會迅速的開啟新的Activity執行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最終新的Activity顯示在用戶界面上。onSaveInstanceState 和 onRestoreInstanceState 兩個方法僅在生命周期異常情況下執行。onSaveInstanceState主要是對異常銷毀的Activity進行數據保存,onRestoreInstanceState主要是對存儲的數據進行恢復,數據存取都是通過Bundle,因此我們可以在Bundle中附加個人數據進行讀寫。經過測試onSaveInstanceState在onStop前調用,onRestoreInstanceState在onStart方法后調用。這兩個方法執行的過程中,系統會自動對視圖進行信息數據的存取,例如:ListView的滾動位置等等。(2)資源內存不足導致低優先級的Activity被殺死

當系統資源不足時,系統會按照上述優先級去殺死目標的 Activity 所在的進程,并在后續通過 onSaveInstanceState 和 onRestoreInstanceState 來存儲和恢復數據。如果一些后臺的進程脫離了四大組件而獨立運行,那么這個進程很快就被殺死。我們常常將后臺工作放到 Service 中保持進程具有一定的優先級。

圖4 configChanges添加orientation后的效果

當系統配置改變時Activity會銷毀重建,通過在AndroidMainManifest.xml中為Activity添加configChanges屬性去避免這個情況。configChanges的屬性有很多,例如:orientation表示屏幕方向變化、KeyboardHidden表示虛擬鍵盤可訪問性變化等,通過設置這些屬性后當運行過程中發生上述情況Activity既不會銷毀重建也不會調用 onSaveInstanceState 和 onRestoreInstanceState 兩個方法,而是執行onConfigChanged方法。

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

這兩組方法對的回調意義不同,onState 和onStop 是從 Activity 是否可見這個角度來回調的,而 onResume 和 onPause 是從 Activity 是否位于前臺這個角度來回調的,不過在實際使用中沒有其他明顯區別。

(2)假設當前Activity為A,如果這時用戶打開了一個新的Activity B,那么B的onResume方法和A的onPause方法誰先執行呢?

根據Android的基本運行機制,不能在onPause中執行重量級的操作,因為必須onPause執行完成以后新Activity才能onResume。onPause和onResume都不能執行耗時的操作,尤其是onPause,這就意味著我們應該在onStop中操作,從而使新的Activity顯示出來并切換到前臺。

原文鏈接:https://blog.csdn.net/kevinjin2011/article/details/124866144

欄目分類
最近更新