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を殺し,コードを表示したはずであると判断したが,やはりそうであった.
ライフサイクルの例をいくつか示します.
SecondActivity(FirstActivityを実行するonStop) を開く SecondActivityインタフェースで、戻りキーをクリックします. SecondActivityでボタンをクリックし、Systemを使用する.exit(0)はAppを強制的に殺す.
FirstActivityはデフォルトで開きます.FirstActivityのonDestroyメソッドは実行されず、onCreateメソッドを直接実行します.
SecondActivityのメソッドは実行されません.
SecondActivityを開きます.(FirstActivityのonDestroyメソッドが実行されます.) SecondActivityインタフェースで、戻りキーをクリックします.
FirstActivityが開き、onCreateメソッドが実行され、Bundleに転送されます.
SecondActivityのライフサイクルは続行されます.
が正常にシャットダウンされている場合、またはシステムによってActivityが強制的に殺されている場合(アクティビティテストは保持されません)、onDestroyが実行されます. コードがAppを強制的に閉じたり、システムによってAppを強制的に殺されたりした場合、onDestroyは実行されません.
ここでは、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
通常の状況
E/FirstActivity: onPause
E/SecondActivity: onCreate bundle null
E/SecondActivity: onStart
E/SecondActivity: onResume
E/SecondActivity: onPostResume
E/FirstActivity: onSaveInstanceState
E/FirstActivity: onStop
E/SecondActivity: onPause
E/FirstActivity: onRestart
E/FirstActivity: onStart
E/FirstActivity: onResume
E/FirstActivity: onPostResume
E/SecondActivity: onStop
E/SecondActivity: onDestroy
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
開発者モードでは、アクティビティを保持しないように設定します。
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
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