数日前、onpause()またはonstop()が呼び出されずにondestroy()が呼び出されるシナリオを書き留めるように求められました。出来ますか。はいの場合は説明してください。
以下のコードを試すと、onDestroy()
とonPause()
のライフサイクルコールバックがスキップされているときに、実際にonStop()
が呼び出されるシナリオが見つかります。
_@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
finish();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("MainActivity", "onDestroy");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e("MainActivity", "onPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e("MainActivity", "onStop");
}
_
つまり、finish()
でアクティビティを作成しているときにonCreate()
を呼び出すと、システムはonDestroy()
を直接呼び出します。
onCreate()メソッド内からfinish()が呼び出された場合、onPause()およびonStop()は呼び出されません。これは、たとえば、onCreate()の実行中にエラーを検出し、結果としてfinish()を呼び出した場合に発生する可能性があります。ただし、そのような場合、onPause()とonStop()で実行する予定のクリーンアップは実行されません。
OnDestroy()はアクティビティのライフサイクルの最後のコールバックですが、このコールバックは常に呼び出されるとは限らず、リソースを破棄するために依存すべきではないことを言及する価値があります。このメソッド(または他のメソッド)を呼び出さずに、システムがアクティビティのホスティングプロセスを単に強制終了する状況があるため、プロセスが終了した後もそのままにしておくことを意図したものを実行するために使用しないでください。 onStart()とonResume()で作成されたリソース、およびonStop()とonPauseでそれぞれ破棄されたリソース。
これは、アクティビティの終了メソッドを呼び出すときに発生します。例:アクティビティ内でthis.finish();
これは、アクティビティで直接finish()を呼び出す場合に可能です。アクティビティでfinish()が呼び出されると、onDestroy()が実行され、次のことが行われます。