18

Javaがガベージコレクションを提供する場合、アクティビティライフサイクルでのonDestroy()の必要性は何ですか?

4

8 に答える 8

26

onDestroy:アクティビティが破棄される前に受信する最後の呼び出し。これは、アクティビティが終了している(finish()と呼ばれる)ため、またはシステムがスペースを節約するためにアクティビティのこのインスタンスを一時的に破棄しているために発生する可能性があります。

ここに例があります......

 public void onDestroy() {
              
   super.onDestroy();

 }
于 2012-12-18T06:32:52.487 に答える
2

OSは、物事がいつ「なくなる」かを決定します。onDestroyは、アクティビティが破棄される前にアプリがクリーンアップする最後のチャンスを与えるためにありますが、アクティビティが実際にGCされることを意味するものではありません。これは、終了ボタンの作成に関連する、読むことをお勧めする良い記事です。それはあなたが尋ねたものと正確には一致しませんが、概念はあなたが何が起こっているのかを理解するのに役立ちます。

于 2012-12-18T06:19:01.430 に答える
1

onDestroy()アクティビティが終了するときにフレームワークによって呼び出されるメソッドです。これは、アクティビティが実行したいシャットダウン操作を実行できるようにするために呼び出されます。このメソッドは、ガベージコレクションとは実際には何の関係もありません(ただし、シャットダウン操作がある場合は、gcできる追加のリソースを解放する必要がある場合があります)。特に、C ++のdestuctorsとは何の関係もありません(その名前にもかかわらず)。

実行するシャットダウン操作がない場合は、それをオーバーライドする必要はありません。基本クラスは基本的に何もしません。

于 2012-12-18T06:11:22.090 に答える
1

onDestroy()を使用して、プログラムを完成させることができます。以下のコードでこれを使用して、クライアントがサーバーへのソケットを閉じていることをサーバーに通知し、サーバー側のユーザーにクライアントが切断されたことを通知できるようにしました。

クライアント:

...
protected void onDestroy(){
    super.onDestroy();
    if(connected) {
        clientMessage.println("exit");
        clientMessage.close();
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    finish();
}
...

サーバ:

...
while (connected) {
    input = clientMessage.readLine();
    if ("exit".equals(input)){
        break;
    }
    ...
}
...
于 2016-01-16T21:58:24.930 に答える
1

AndroidアクティビティライフサイクルのonDestroyドキュメント:

onDestroy()アクティビティが破棄される前に呼び出されます。システムは、次のいずれかの理由でこのコールバックを呼び出します。

  • アクティビティが終了している(ユーザーがアクティビティを完全に却下したためfinish()、またはアクティビティで呼び出されたため)、または
  • 構成の変更(デバイスのローテーションやマルチウィンドウモードなど)により、システムが一時的にアクティビティを破棄しています

Activity#onDestroy()APIドキュメントもそれに非常によく答えています:

このメソッドは通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されます。これにより、破棄されたアクティビティが、アプリケーションの残りの部分がまだ実行されている間、そのようなものを残さないようにします。ソース

ドキュメントからの引用によると、破壊されたアクティビティが物事を残してしまうのを防ぐためです(たとえば、参照、スレッドによるメモリリーク)が、アプリの残りの部分がまだ実行されている場合に限ります。アプリケーションプロセスが終了した場合、OSが自動的にクリーンアップするため、スレッドやその他のリソースのクリーンアップを忘れても問題ありません。をオーバーライドする必要はありませんonDestroy

sam786が実行していること(オーバーライドしてスーパーメソッドを呼び出すだけ)を実行する必要はありません。これは絶対に役に立たないためです。他のすべての答えは「クリーンアップ」の線に沿っているように見えますが、どのような種類のクリーンアップまたはいつかを説明していません。データが呼び出されることを保証できないためonDestroy()、にデータを保存しないでください。データが失われることがあります。たとえば、ホームボタンを押しても呼び出されません(データを保存したい場合)。

于 2020-10-01T20:47:23.137 に答える
0

これにより、プログラムは、関連するアプリケーションを汚染しないように、リソース(スレッドなど)のクリーンアップなどを行うことができます。使用する必要がない場合は、オーバーライドしないでください。

参照:onDestroy()-Androidリファレンス

于 2012-12-18T06:12:07.787 に答える
0

onDestroyは、アクティビティが破棄される前にアプリがクリーンアップする最後のチャンスを与えるためにあります

Androidの記事終了ボタン

于 2012-12-18T06:11:15.353 に答える
0

onDestroyは、アクティビティが破棄されたときに呼び出される場合がありますが、それを信頼することはできません。システムがこのメソッド(または他のメソッド)を呼び出さずにアクティビティのホスティングプロセスを単に強制終了する場合があるため、プロセスが終了した後も存続することを目的としたことを行うために使用しないでください。

参照:http://developer.android.com/reference/android/app/Activity.html#onDestroy()

于 2014-08-19T13:43:13.487 に答える