web-dev-qa-db-ja.com

Android Activity onDestroy()は常に呼び出されるとは限らず、呼び出されるとコードの一部のみが実行されます

onDestroy()は常に呼び出されるとは限りません。呼び出された場合、コードの一部のみが実行されます。
そして、ほとんどの場合、LogCatには「gps state on destroy on first called」というメッセージしか表示されません。何故ですか?

protected void onDestroy(){
    super.onDestroy();
    Log.d("on destroy called", "gps state on destroy called first");

    editor.putBoolean("gpsOn", false);
    Log.d("on destroy called", "gps state on destroy called second");
    editor.commit();

    Log.d("on destroy called", "gps state on destroy called third");
    stopRouteTracking();
    Log.d("on destroy called", "gps state on destroy called  fourth");      





}
23
ksu

これを見てください:

Activity OnDestroyは呼び出されませんか?

この:

http://developer.Android.com/reference/Android/app/Activity.html#onDestroy%28%29

基本的に、onDestroy()が呼び出される保証はなく、場合によっては、メソッド呼び出しをバイパスして、アプリなどのプロセスが直接強制終了されます。

14
Chris

Android開発者向けドキュメント ここ では、それを見ることができます-

強制終了可能とマークされているメソッドの場合、そのメソッドが返された後、アクティビティをホストしているプロセスは、コードの別の行が実行されずにいつでも強制終了されます。このため、onPause()メソッドを使用して、永続的なデータ(ユーザー編集など)をストレージに書き込む必要があります。

およびonStop()とonDestroy()は両方とも強制終了可能としてマークされます。

これは、onStop()の実行後いつでもプロセスを破棄できるため、onDestroy()で記述されたコードの一部のみが呼び出される理由です。

8
Karan

@Chrisの答えは正しいですが、コードの一部のみが呼び出されるという問題は、コードを呼び出す前にsuper.onDestroy()を呼び出すことで発生する可能性があります。 super.onDestroy()は最後に呼び出す必要があります。コードが破棄される前に呼び出されるためです。

0
HaydenKai