2012-08-10 22 views
2

我實現了具有以下特點的Android應用程序:如何正確地終止Android應用程序與現場插座

應用:public class ApplicationGlobalAgent extends Application包含:

  • 一個MainActivity:顯示GUI描繪 - >,並開始從其他活動它。
  • 一個網絡ServerSocket和一個客戶端Socket:以雙工模式發送/接收數據。

我要終止應用程序時MainActivity完成,我做了如下:

在MainActivity擴展活動:

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

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

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

在ApplicationGlobalAgent擴展應用:

@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()); 
} 

分BUT的結果是:

當沒有網絡連接,應用程序成功終止,否則"Terminated!"從不打印直到我收於另一側的網絡套接字(誰連接到Android套接字)。

那麼,如何在連接網絡套接字退出MainActivity時,我的強制應用程序正確並完全終止

感謝您的幫助!

+1

殘忍地說,幾乎所有的東西都是不正確的。我*強烈*鼓勵您閱讀[**流程生命週期**](http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle)和[**'活動'生命週期**](http://developer.android.com/guide/components/activities.html#Lifecycle)。 – 2012-08-10 03:09:20

回答

3

@Override public void finish()

你應該重寫onDestroy代替。

getApplication().onTerminate();

決不調用此直接。

System.gc();

這實在是沒有必要的。

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

爲什麼你有在自己的應用程序調用killProcess?您應該讓Android運行時系統爲您殺死進程。

當連接網絡套接字存在MainActivity時,我該如何強制應用程序正確完全終止?

除非您分配的資源在Java進程被內核終止時不會被清理,否則不需要擔心清理。

+0

感謝您的快速回復,但您的建議不起作用(我剛剛測試過)。實際上,我已經閱讀了許多關於查殺過程的Stack-overflow線程。但是我的問題是,當所有子過程完成時,application.onTerminate()只會被系統進程管理器調用,所以應用程序將等待mNetworkManager.DoStop()完成其關閉連接和偵聽套接字的網絡線程。 我打算試着把: 'android.os.Process.killProcess(android.os.Process.myPid());' 在onTerminate()的頂部看看它是如何工作的。 – 2012-08-10 03:45:54

+1

'onTerminate'永遠不會被系統調用,除了在模擬環境中(請閱讀[** docs **](http://bit.ly/fBd487))。同樣,您不應該調用'killProcess'或'onTerminate' ...您可能想要關閉「Activity」的「onDestroy」中的線程 – 2012-08-10 03:56:25

+1

是的,您是對的! 這就是爲什麼我嘗試從主要活動顯式調用app.onTerminate()我必須在全局應用程序中實現網絡線程,爲所有應用程序的子活動提供獨特的網絡應用程序。可笑的是,不推薦使用'Thread.stop()或Thread.destroy()'方法來安全終止[ Thread.join(持續時間)'爲我的情況]。我已經按照您的建議將'activity.finish()'改爲'onDestroy()',但網絡服務器仍然沒有終止。 – 2012-08-10 05:46:49