複習Activity各種場景的生命週期

語言: CN / TW / HK


highlight: a11y-dark theme: juejin


小知識,大挑戰!本文正在參與“   程式設計師必備小知識   ”創作活動

本文同時參與 「掘力星計劃」   ,贏取創作大禮包,挑戰創作激勵金

Activity是Android元件中最基本也是最為常見用的四大元件之一,也是我們在開發過程之中接觸最多的元件,所以瞭解Activity的生命週期,並正確的理解與應用,是必不可少的。之前看到很多錯誤文章,今天特意自己親自測試一遍,下面就來介紹一下Activity生命週期。

一.官網生命週期

在這裡插入圖片描述 上面圖概括了android生命週期的各個環節,描述了activity從生成到銷燬的過程。

  • onCreate:該方法時整個Activity生命週期的第一個方法,它表示Activity正在被建立,日常開發過程中,相信大家接觸最多的就是這個方法,在這個方法中我們常常做一些初始化的工作(如載入佈局資源、初始化資料等操作),此時Activity不可見。

  • onStart:顧名思義,該方法代表Activity正在被啟動,此時Activity已經可見,但是無法響應使用者的互動動作。

  • onResume:該方法表示Activity已經經過前面步驟建立完成,此時Activity已經可見並且已經來前臺,使用者能夠看到介面並且能夠進行互動操作並獲得響應。

  • onPause:onPause方法表示Activity正在暫停,正常情況下,onStop緊接著就會被呼叫。在特殊情況下,如果這個時候使用者快速地再回到當前的Activity,那麼onResume會被呼叫(希望你手速夠快,很難出現)。一般來說,在這個生命週期狀態下,可以做一些儲存資料、停止動畫的工作,但是該方法不能執行耗時操作,這是由於啟動新的Activity而喚醒的該狀態,那會影響到新Activity的啟動,原因是新的Activity的onResume方法是在老Activity的onPause執行完後才執行的(具體原因可以看下系統啟動Activity的機制)。

  • onStop:表示Activity即將停止,可以做一些稍微重量級的資源回收工作等,同樣也不能太耗時。

  • onDestroy:表示Activity即將被銷燬,這是Activity生命週期的最後一個回撥,我們可以做一些回收工作和最終的資源釋放(如Service、BroadReceiver、Map等)。

  • onRestart:表示Activity正在重新啟動,一般情況下,在當前Activity從不可見重新變為可見的狀態時onRestart就會被呼叫。這種情形一般是由於使用者的行為所導致的,比如使用者按下Home鍵切換到桌面或者打開了一個新的Activity(這時當前Activity會暫停,也就是onPause和onStop被執行),接著使用者有回到了這個Activity,就會出現這種情況。

二.常見一些情景

### 1.直接啟動一個MainActivity java MainActivity: onCreate MainActivity: onStart MainActivity: onResume

2.在MainActivity中啟動TwoActivity

此時MainActivity中先執行onPause方法,然後 TwoActivity執行onCreate → onStart → onResume,TwoActivity完全顯示後才會執行MainActivity的 onStop方法

java MainActivity: onPause TwoActivity: onCreate TwoActivity: onStart TwoActivity: onResume MainActivity: onStop

3.TwoActivity中點選back返回

此時TwoActivity 先執行 onPause方法,MainActivity執行onRestart→ onStart → onResume,最後TwoActivity 執行onStop→ onDestroy java TwoActivity: onPause MainActivity: onRestart MainActivity: onStart MainActivity: onResume TwoActivity: onStop TwoActivity: onDestroy

3.MainActivity中點選home或者鎖屏按鍵

java MainActivity: onPause MainActivity: onStop

4.重新進入MainActivity

java MainActivity: onRestart MainActivity: onStart MainActivity: onResume

5.MainActivity 點選彈窗dialog

  • 注意:之前被很多人誤導有生命週期變化,真實測試後發現沒變化 java **** 無生命週期變化 **** **** 無生命週期變化 **** **** 無生命週期變化 ****

6.MainActivity 點選跳轉透明Activity

設定透明activity的方法可以通過style ```java

```

發現跳轉到透明TransActivity後MainActivity並沒有執行onstop方法

java MainActivity: onPause TransActivity: onCreate TransActivity: onStart TransActivity: onResume

7.透明Activity點選返回

MainActivity直接就執行了onResume方法 java TransActivity: onPause MainActivity: onResume TransActivity: onStop TransActivity: onDestroy

8.透明Activity中點選home或者鎖屏按鍵

發現TransActivity和MainActivity都呼叫了onStop方法 java TransActivity: onPause TransActivity: onStop MainActivity: onStop

9.重新進入透明Activity

發現MainActivity也執行了onRestart → onStart java MainActivity: onRestart MainActivity: onStart TransActivity: onRestart TransActivity: onStart TransActivity: onResume

三.Activity中onSaveInstanceState()和onRestoreInstanceState()

1.onSaveInstanceState(Bundle outState):

onSaveInstanceState函式在Activity生命週期中執行。 outState 引數作用 : 資料儲存 : Activity 宣告週期結束的時候, 需要儲存 Activity 狀態的時候, 會將要儲存的資料使用鍵值對的形式 儲存在 Bundle 物件中;

呼叫時機 : Activity 被銷燬的時候呼叫, 也可能沒有銷燬就呼叫了; 按下Home鍵 : Activity 進入了後臺, 此時會呼叫該方法; 按下電源鍵 : 螢幕關閉, Activity 進入後臺; 啟動其它 Activity : Activity 被壓入了任務棧的棧底; 橫豎屏切換 : 會銷燬當前 Activity 並重新建立;

onSaveInstanceState方法呼叫注意事項 : 使用者主動銷燬不會呼叫 : 當用戶點選回退鍵 或者 呼叫了 finish() 方法, 不會呼叫該方法; 呼叫時機不固定 : 該方法一定是在 onStop() 方法之前呼叫, 但是不確定是在 onPause() 方法之前 還是 之後呼叫; 佈局中元件狀態儲存 : 每個元件都 實現了 onSaveInstance() 方法, 在呼叫函式的時候, 會自動儲存元件的狀態, 注意, 只有有 id 的元件才會儲存; 關於預設的 super.onSaveInstanceState(outState) : 該預設的方法是實現 元件狀態儲存的;

MainActivity按電源鍵進入後臺的生命週期如下: java MainActivity: onPause MainActivity: onStop MainActivity: onSaveInstanceState

2.onRestoreInstanceState(Bundle outState):

方法回撥時機 : 在 Activity 被系統銷燬之後 恢復 Activity 時被呼叫, 只有銷燬了之後重建的時候才呼叫, 如果記憶體充足, 系統沒有銷燬這個 Activity, 就不需要呼叫; – Bundle 物件傳遞 : 該方法儲存的 Bundle 物件在 Activity 恢復的時候也會通過引數傳遞到 onCreate() 方法中;

四.activity的程序優先順序。

java 前臺程序>可見程序>service程序>後臺程序>空程序 前臺程序: java 1.當前程序activity正在與使用者進行互動。 2.當前程序service正在與activity進行互動或者當前service呼叫了startForground()屬於前臺程序或者當前service正在執行生命週期(onCreate(),onStart(),onDestory()) 3.程序持有一個BroadcostReceiver,這個BroadcostReceiver正在執行onReceive()方法 可見程序: : 1. 程序持有一個activity,這個activity不再前臺,處於onPause()狀態下,當前覆蓋的activity是以dialog形式存在的。 2. 程序有一個service,這個service和一個可見的Activity進行繫結。 service程序: java 1.當前開啟startSerice()啟動一個service服務就可以認為程序是一個服務程序。 後臺程序: java activity的onStop()被呼叫,但是onDestroy()沒有呼叫的狀態。該程序屬於後臺程序。 空程序 java 改程序沒有任何執行的資料了,且保留在記憶體空間,並沒有被系統killed,屬於空程序。該程序很容易被殺死。