2

次の機能を備えた Android アプリケーションを実装しました。

アプリケーション:public class ApplicationGlobalAgent extends Application内容:

  • MainActivity: GUI 描画を表示 -> それから他のアクティビティを開始します。
  • ネットワーク ServerSocket とクライアント Socket: 二重モードでデータを送受信します。

MainActivity が終了したらアプリケーションを終了したいので、次のようにしました。

MainActivity では、Activity を拡張します。

@Override
public void finish()
{
    super.finish();

    Log.d(DEBUG_TAG, "finish and call app termination");

    //call the application to terminate
    getApplication().onTerminate(); 
}

ApplicationGlobalAgent では、Application を拡張します。

@Override
public void onTerminate()
{
    // do close ServerSocket and client Socket in networking threads
    mNetworkManager.DoStop();

    System.gc();

    Log.d(DEBUG_TAG, "Terminated!");

    super.onTerminate(); //?? should be placed at the end of functions ??

    //totally kill this application process
    android.os.Process.killProcess(android.os.Process.myPid());
}

しかし、結果は次のとおりです。

ネットワーク接続がない場合、アプリケーションは正常に終了します。それ以外の場合"Terminated!"は、反対側 (Android ソケットに接続した人) のネットワーク ソケットを閉じるまで印刷されません。

では、ネットワークソケットを接続してMainActivityを終了するときに、アプリケーションを適切かつ完全に終了させるにはどうすればよいですか?

あなたのすべての助けに感謝します!

4

1 に答える 1

3

@Override public void finish()

onDestroy代わりにオーバーライドする必要があります。

getApplication().onTerminate();

これを直接呼び出さないでください。

System.gc();

これは本当に必要ありません。

android.os.Process.killProcess(android.os.Process.myPid());

killProcessアプリケーション自体を呼び出すのはなぜですか? Android ランタイム システムにプロセスを強制終了させる必要があります。

MainActivity接続しているネットワーク ソケットが存在する場合、アプリケーションを強制的に適切かつ完全に終了させるにはどうすればよいですか?

Java プロセスがカーネルによって強制終了されたときにクリーンアップされないリソースを割り当てていない限り、クリーンアップについて心配する必要はありません。

于 2012-08-10T03:04:11.000 に答える