web-dev-qa-db-ja.com

Android onpause()またはonstop()なしでondestroy()が呼び出されるシナリオ

数日前、onpause()またはonstop()が呼び出されずにondestroy()が呼び出されるシナリオを書き留めるように求められました。出来ますか。はいの場合は説明してください。

21
Hemant Parmar

以下のコードを試すと、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()を直接呼び出します。

24
AADProgramming

onCreate()メソッド内からfinish()が呼び出された場合、onPause()およびonStop()は呼び出されません。これは、たとえば、onCreate()の実行中にエラーを検出し、結果としてfinish()を呼び出した場合に発生する可能性があります。ただし、そのような場合、onPause()とonStop()で実行する予定のクリーンアップは実行されません。

OnDestroy()はアクティビティのライフサイクルの最後のコールバックですが、このコールバックは常に呼び出されるとは限らず、リソースを破棄するために依存すべきではないことを言及する価値があります。このメソッド(または他のメソッド)を呼び出さずに、システムがアクティビティのホスティングプロセスを単に強制終了する状況があるため、プロセスが終了した後もそのままにしておくことを意図したものを実行するために使用しないでください。 onStart()とonResume()で作成されたリソース、およびonStop()とonPauseでそれぞれ破棄されたリソース。

屈折- https://www.toptal.com/Android/interview-questions

5

これは、アクティビティの終了メソッドを呼び出すときに発生します。例:アクティビティ内でthis.finish();

3
Zeyad Assem

これは、アクティビティで直接finish()を呼び出す場合に可能です。アクティビティでfinish()が呼び出されると、onDestroy()が実行され、次のことが行われます。

  1. アクティビティが管理していたダイアログをすべて閉じます。
  2. アクティビティが管理していたカーソルをすべて閉じます。
  3. 開いている検索ダイアログをすべて閉じます
1
Antariksh