ActivityライフサイクルonDestroy

3109 ワード

Activityライフサイクルを紹介する記事はネット上にたくさんあります.
ここでは、onDestroyが実行するシーンについて重点的に説明します.
まずライフサイクルフローチャートを見てみましょう
開発者に無視されがちなのは、onDestroyメソッドは、Appが強制的に殺された場合には実行されません.
最近サードパーティsdkを統合する際に発生した現象は、onDestroyメソッドの実行を判断することによって、重大なバグを回避します.
例:Activity Aは私のプロジェクトのメインインタフェースActivity Bはサードパーティsdkプロジェクトのメインインタフェースです
Activity AはActivity Bを起動し、Activity Bインタフェースは戻るキーをクリックしてActivity Aに戻ります.
インタフェースを見ると,Activity Aのたびに初期化が再開され,特に遅いことが分かった.ActivityAのライフサイクルを印刷することでonDestroyメソッドは実行されていないがonCreateメソッドが実行されていることが判明したので,サードパーティsdkがメインインタフェースの戻り時にAppを殺し,コードを表示したはずであると判断したが,やはりそうであった.
ライフサイクルの例をいくつか示します.

FirstActivityの起動

E/FirstActivity: onCreate bundle null
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume

通常の状況

  • SecondActivity(FirstActivityを実行するonStop)
  • を開く
    E/FirstActivity: onPause
    E/SecondActivity: onCreate bundle null
    E/SecondActivity: onStart
    E/SecondActivity: onResume
    E/SecondActivity: onPostResume
    E/FirstActivity: onSaveInstanceState
    E/FirstActivity: onStop
    
  • SecondActivityインタフェースで、戻りキーをクリックします.
  • E/SecondActivity: onPause
    E/FirstActivity: onRestart
    E/FirstActivity: onStart
    E/FirstActivity: onResume
    E/FirstActivity: onPostResume
    E/SecondActivity: onStop
    E/SecondActivity: onDestroy
    
  • SecondActivityでボタンをクリックし、Systemを使用する.exit(0)はAppを強制的に殺す.

  • FirstActivityはデフォルトで開きます.FirstActivityのonDestroyメソッドは実行されず、onCreateメソッドを直接実行します.
    SecondActivityのメソッドは実行されません.
    E/FirstActivity: onCreate bundle Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=800], android:lastAutofillId=1073741823}]
    E/FirstActivity: onStart
    E/FirstActivity: onResume
    E/FirstActivity: onPostResume
    

    開発者モードでは、アクティビティを保持しないように設定します。

  • SecondActivityを開きます.(FirstActivityのonDestroyメソッドが実行されます.)
  • E/FirstActivity: onPause
    E/SecondActivity: onCreate bundle null
    E/SecondActivity: onStart
    E/SecondActivity: onResume
    E/SecondActivity: onPostResume
    E/FirstActivity: onSaveInstanceState
    E/FirstActivity: onStop
    E/FirstActivity: onDestroy
    
  • SecondActivityインタフェースで、戻りキーをクリックします.

  • FirstActivityが開き、onCreateメソッドが実行され、Bundleに転送されます.
    SecondActivityのライフサイクルは続行されます.
    E/SecondActivity: onPause
    E/FirstActivity: onCreate bundle Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=800], android:lastAutofillId=1073741823}]
    E/FirstActivity: onStart
    E/FirstActivity: onResume
    E/FirstActivity: onPostResume
    E/SecondActivity: onStop
    E/SecondActivity: onDestroy
    

    onDestroyメソッド実行ロジック

  • が正常にシャットダウンされている場合、またはシステムによってActivityが強制的に殺されている場合(アクティビティテストは保持されません)、onDestroyが実行されます.
  • コードがAppを強制的に閉じたり、システムによってAppを強制的に殺されたりした場合、onDestroyは実行されません.