天天看點

Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

一、Activity切換的生命周期

前面Android基礎知識(五):Activity的生命周期一文中,提到的關于Activity的生命周期隻是單個Activity的生命周期,沒有說明從一個Activity進入另一個Activity時,或者從一個Activity傳回到上一個Activity時這些函數的調用順序。

從一個Activity進入另一個Activity的函數調用順序如下。

Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

從上圖可以看到,Activity B在被建立之前(調用onCreate之前),Activity A需要先完成onPause的回調,即前文所說的,onPause方法執行之後,新Activity的onResume方法才會執行。

是以onPause方法中雖然可以做一些資料存儲或者動畫停止或者資源的釋放,但是不能太耗時。

從Activity B傳回到上一個Activity(A)的函數回調順序圖如下。

Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

上圖考慮的是Activity A完全不可見的情況下,Activity A會回調onStop方法。

二、onNewIntent()觸發機制

筆記:Android基礎知識(六):Activity的啟動模式中,提到了Activity的四種啟動模式,在啟動模式singleTask和singleTop中,由于系統會判斷傳回棧中是否存在執行個體,若存在(singleTop還要求處于棧頂)執行個體,那麼系統會将請求發送到該執行個體上,是以不會調用正常的onCreate方法,而是調用onNewIntent方法。

如下所示為onNewIntent調用時機圖。

Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

當Activity(假設為A)的launchMode為singleTop且A的執行個體處于棧頂,或者launchMode為singleTask且A的執行個體已經在棧裡(無論是棧頂還是棧中),再次啟動Activity A時,便不會調用onCreate()去産生新的執行個體,而是調用onNewIntent()并重用傳回棧裡的A執行個體。

如果A在棧頂,那麼方法回調的調用順序依次為A.onPause() -> A.onNewIntent() -> A.onResume()。A的launchMode可以為singleTo或者是singleTask。

如果A不在棧頂,此時它處于A.onStop()狀态,當再次啟動時,調用順序依次是A.onStop() -> A.onNewIntent() -> A.onRestart() -> A.onStart() -> A.onResume()。A的launchMode隻能是singleTask。

三、onNewIntent()注意事項

  1. 系統kill背景Activity

    需要注意的是Android系統随時會kill背景Activity,如果Activity被kill,那麼系統就會調用onCreate方法,而不是調用onNewIntent方法,是以為了解決這個問題,onCreate和onNewIntent方法中需要調用同一個處理資料的方法。

    Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制
  2. onNewIntent()的setIntent()和getIntent()

    在使用getIntent()方法擷取Intent之前,需要調用setIntent(Intent)方法,否則getIntent()擷取的資料将不是所期望的結果。

    getIntent()方法傳回的依舊是原來的Intent,需要調用setIntent(Intent)方法更新Intent。

    Android基礎知識(七):Activity互調之間的生命周期變化與onNewIntent()觸發機制

參考資料:Android activity onNewIntent調用時機

Android:onNewIntent()觸發機制及注意事項

繼續閱讀