2012-03-02 65 views
4

我正在尋找一種方法來通過代碼退出我的android應用程序。 是的,我知道,我不應該這樣做,因爲當你按下後退按鈕時,android會處理它,但是我有一個自定義的流程,迫使我執行此操作。我已經搜索了一段時間,並找到了多個答案:退出Android應用程序的最佳方法?

  • 不應該這樣做=>沒有選項。
  • 在我的活動中調用finish()=>僅針對1個活動,而不是整個應用程序。
  • 用特殊標誌=>開始一個Intent到第一個活動我擁有多個入口點,所以不是一個真正的選項。
  • 只要殺死我自己的進程=>不知道這一個,這會在所有活動中調用onDestroy()方法嗎?我的後臺服務會繼續運行嗎? (不應該停止)

所以我想知道,是否有任何其他選項退出我的應用程序,或者我真的只限於這些選項? 如果確實沒有其他選項,那麼我正在考慮在我的Application類中創建所有活動實例的列表,然後循環它們以調用finish()。但我不知道這是否是解決這個問題的正確方法。

所以這就是爲什麼我在這裏問我的問題,這是關閉我的應用程序的最佳方式?

編輯:我或多或少地修復了這個問題。我有我的活動的WeakReference列表。在每一個onCreate中,我都將活動添加到列表中。然後,當我想退出我的應用時,我只是循環列表並調用finish()。問題是:如果列表變得太大,它不會完成我所有的活動,因爲android已經銷燬了它們。所以每當我知道我不再需要它們時,我就完成它們。就我而言,這個列表不能超過3/4個活動,因此不需要再擔心活動沒有完成。同樣用這種方法,我不必破壞我自己的過程。

+0

也許'系統'類可以幫助(或Android等效)? (我不熟悉android編程) – 11684 2012-03-02 11:21:49

+2

請閱讀[this](http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon) – Ghost 2012-03-02 11:26:22

+1

「我有一個自定義的流程這迫使我實現這個「 - 這是你的應用程序中的一個錯誤。請修復您的應用程序中的錯誤。 – CommonsWare 2012-03-02 13:26:42

回答

3

你不應該這樣做,但是反正如果你堅持:

System.exit(0); 
+0

這也是我找到的一種方式,忘了提及它。但是這個問題是,當我再次打開我的應用程序時,它會重新創建我關閉應用程序時打開的活動。 – Arne517 2012-03-02 11:38:22

3

使用下面的代碼。

android.os.Process.killProcess(android.os.Process.myPid()); 
    System.runFinalizersOnExit(true); 
+1

我真的很需要這樣做(Android的早期版本帶有OpenGL資源泄漏漏洞,所以我不得不在兩次調用之間關閉應用程序來強制Android清理)。我通過使用'android:process =「foo」'強制這個活動進入它自己的進程,以避免在進程死亡時終止其他活動並使用上述代碼。它實際上工作。 – 2012-03-02 11:38:26

+0

這將打開所有打開的活動onDestroy?也不會停止我的運行服務? – Arne517 2012-03-02 11:38:46

+0

在這個過程中實例化的所有活動和服務將會消失,就好像Android由於內存不足而固化了進程。這就是爲什麼你需要使用'android:process',這樣你就不想在不同的過程中殺死任何人。 – 2012-03-02 11:40:02

-1

您可以在列表中保留所有已啓動活動的列表(使用WeakReference來避免內存泄漏)。要退出應用程序,首先調用每個項目的finish方法,然後調用android.os.Process.killProcess(android.os.Process.myPid());

+2

沒有生產代碼應該使用'killProcess()'。 – CommonsWare 2012-03-02 13:27:44

+0

我只是試過這個,但是當我有很多開放的活動(那些android會銷燬它們,當我重新訪問它們時重新創建它們),這種方法不起作用。它仍然會重新創建這些活動。 – Arne517 2012-03-02 13:44:50

+0

@ Arne517這就是爲什麼你應該先完成所有的活動,然後調用killProcess。如果你先完成他們,他們將不會被重新創建 – 2012-03-02 14:12:52

0

不推薦,但你仍然可以使用它。如果您需要退出應用程序,最好使用此解決方案。

根據我的最佳解決方案是完成您的應用程序中的每個活動,如下所示。

step1)在mainactivity中維護一個靜態變量。

public static isQuit = false; 

step2)點擊一個按鈕的事件使這個變量爲真。

mainactivity.isQuit = true; 

step3)並且在您的應用程序的每個活動中都有onrestart方法,如下所示。

@Override 
     protected void onRestart() { 
     // TODO Auto-generated method stub 
     super.onRestart(); 
     if(mainactivity.isQuit) 
      finish(); 
    }