Android之Activity生命週期探索

Task & Back Stack

        Android中的Activity全都歸屬於Task管理,Task是多個Activity的集合,這些Activity按照啓動順序排隊存入一個棧(Back Stack)。
        Android默認會爲每個App維持一個Task來存放該App所有的Activity,默認Task的name爲該App的packagename。
        可以在AndroidManifest.xml中申明Activity的taskAffinity屬性來自定義Task,但不建議使用,因爲如果其他App也申請了相同的Task,有可能啓動到我們的Activity帶來安全問題。



Activity生命週期回調方法

在這裏插入圖片描述

        onCreate():在Activity第一次創建的時候調用,在這個回調方法中完成Activity的初始化操作,比如加載佈局,初始化控件,綁定監聽事件等;
        onStart():在Activity由不可見到可見的時候調用;
        onResume():在Activity準備好和用戶交互的時候調用,此時的Activity一定唯一Back Stack棧頂,並且處於running運行狀態;
        onPause():在系統準備去啓動或者恢復另一個Activity的時候調用;
        onStop():在Activity完全不可見的時候調用;
        onDestroy():在Activity被銷燬之前調用,之後Activity的狀態將變爲銷燬狀態;
        onRestart():在Activity由停止狀態變爲運行狀態之前調用,Activity重啓時調用;



代碼下Activity生命週期展示

//創建到銷燬的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onDestroy()

//從啓動到後臺,再到前臺的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onRestart() ——> onStart() ——> onResume()

//從啓動到失去焦點,再到獲取到焦點的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onResume()

//停止狀態(Stopped)Activity被完全遮擋,但保留所有狀態和成員信息



Activity的內部調用過程

        打開一個新的Activity實例的時候系統依次調用onCreate()、onStart()、onResume()然後開始running運行狀態;

調用
調用
調用
to
Activity
onCreate
onStart
onResume
running狀態

running的時候Activity被覆蓋系統調用onPause()方法,接下來它有三個選擇;
        1.用戶返回到該Activity就調用onResume()方法重新running運行狀態;

被覆蓋
返回Activity
to
running
onPause
onResume
running狀態

        2.用戶回到桌面或者打開其他Activity就會調用onStop()進入停止狀態;

被覆蓋
回到桌面或打開其他Activity
to
running
onPause
onStop
stop狀態

        3.系統內存不足或者擁有更高權限的應用需要內存,該Activity的進程可能會被系統回收,想要重新打開就必須重新創建。如果用戶返回到onStop()狀態Activity,系統會調用onRestart()、onStart()、onResume()然後重新running運行,在Activity結束或者被系統殺死之前會調用onDestroy()方法釋放掉所有佔用的資源。

被回收
重新創建
調用
調用
to
running
onStop
onRestart
onStart
onResume
running狀態



Activity的四種狀態

        活動狀態(Active/Running)Activity處於界面最頂端,獲取焦點;
        暫停狀態(Paused)Activity失去焦點,但對用戶可見;
        停止狀態(Stopped)Activity被完全遮擋,但保留所有狀態和成員信息;
        非活動狀態(Killed)Activity被停止;



Activity生命週期的嵌套循環

        1.完整生存期:在onCreate()調用和onDestroy()調用之間發生;
        2.可見生存期:在onStart()調用和onStop()調用之間發生,系統會在Activity的整個生命週期內多次調用onStart()和onStop(),因爲Activity可能會在顯示和隱藏之間不斷地來回切換;
        3.前臺生存期:在onResume()調用和onPause()調用之間發生,因爲這個狀態可能會經常發生轉換,爲了避免切換遲緩引起的用戶等待,這兩個方法中的代碼應該相當的輕量化;



Activity生命週期交互設計思想

1.多個Activity的生命週期交互

跳轉
MainActivity
SecondActivity
//啓動MainActivity
MainActivity:onCreate() ——> onStart() ——> onResume() 

//通過MainActivity啓動SecondActivity
MainActivity:onPause()
SecondActivity:onCreate() ——> onStart() ——> onResume() 
MainActivity:onStop()

//在SecondActivity點擊Back鍵返回MainActivity
SecondActivity:onPause()
MainActivity:onRestart() ——> onStart() ——> onResume() 
SecondActivity:onStop  ——> onDestroy()

2.爲什麼要先暫停當前顯示的Activity?

        爲什麼MainActivity啓動SecondActivity先使用MainActivity的onPause()方法然後再去打開SecondActivity呢?
        爲什麼不在SecondActivity啓動完成後再調用MainActivity的onPause()方法呢?
        這樣設計的原因是爲了防止當MainActivity進行着一些功能的時候不對其所在的Activity進行暫停就進入下一個Activity進行操作,很可能因爲功能重疊造成很糟糕的用戶體驗。所以我們在一個Activity進入到另外一個Activity之前要先調用前一個Activity的onPause()方法將這個Activity所有活動暫停後再去執行下一個Activity。


3.爲什麼要先執行要打開Activity的onCreate()、onStart()、onResume()方法?

        這個Google爲我們做的一個保護的機制,假設我們在啓動SecondActivity的時候出現一些異常信息被crush掉了。如果我們在第一個Activity的onPause()方法之後直接調用onStop方法,那麼這個Activity就變成不可見。那麼現在這個時候第一個Activity處於不可見狀態,第二個Activity被crush掉了,整個應用程序就處於黑屏的狀態。
        所以Google爲了針對這種情況設計的是MainActivity啓動SecondActivity先將MainActivity暫停onPause了後啓動SecondActivity的生命週期,當SecondActivity完全啓動後再調用MainActivity的onStop方法將它置於後臺,那麼這個時候顯示的就是SecondActivity。
        Crash:因爲程序或者各種原因而導致的程序意外退出,俗稱"閃退";

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章