2013-03-21 92 views
16

場景:

我在我的Android應用四項活動,可以說A,B,C和D有在一個延伸,以維持全球應用程序狀態Application類應用一個Constants.java類。 Constants類具有應用程序的所有常量變量。活動流程如圖A-->B-->C-->D。當從活動A按下後退按鈕時,我調用了完成活動A並關閉應用程序的finish()方法。之後,如果我從所有應用程序中打開應用程序,則在Constants.java中存在一個變量,其值從上次啓動時開始持續。當我正在做System.exit(10)後跟Process.killProcess(Process.myPid())來自活動A(在按下後)時,同樣的事情不會發生。當應用程序的所有活動結束後會發生什麼?

問題:

  1. 將通過調用每個活動的結束()將關閉應用程序(它的進程)完成所有活動?
  2. 即使所有活動完成(閉合),變量的值如何仍然存在?
  3. 對於退出應用程序,撥打System.exit(10)後跟Process.killProcess(Process.myPid())是否公平?

更新:

如何我可以明確的應用程序(HomeActivity的後退出版社)退出應用程序常數?

+1

常量根據定義不會改變,所以爲什麼要打擾他們呢? – m0skit0 2013-05-30 18:26:52

+0

簡單:不要調用'System.exit()'(根據SO討論,完全不推薦)。只需在HomeActivity完成時清除變量。 – 2013-06-04 08:26:32

回答

14

1)不,Android不保證。由操作系統來決定是否終止進程。

2)因爲Activity實例仍然存在於Dalvik虛擬機中。在Android中,每個進程都有一個獨立的Dalvik虛擬機。

每個進程都有自己的虛擬機(VM),因此應用程序的 代碼與其他應用程序隔離運行。

當您撥打finish()這並不意味着Activity實例被垃圾收集。你告訴Android你想要關閉Activity(不要再顯示它)。在Android決定終止進程(並因此終止DVM)或實例被垃圾收集之前,它仍然存在。

的Android啓動時的任何應用程序的組件 需要的要執行的程序,然後關閉過程中,當它不再需要 或系統必須恢復內存爲其他應用程序。

3)我不會這樣做,除非你有很強的理由。作爲一個經驗法則,您應該讓Android處理何時終止您的應用程序,除非您的應用程序狀態中存在某些應用程序在失去焦點時需要重置的情況。

Quotes source

+1

我也在某個地方看到android決定何時殺死一個進程 – 2013-03-21 10:08:15

+0

@nidhi_adiga這就是我說的:*「由操作系統來決定是否終止進程。」* – m0skit0 2013-03-21 10:22:25

+0

只是爲了澄清:*由OS 「*我的意思是Android ofc。 – m0skit0 2013-03-21 11:44:01

5

通過調用完成每項活動的()將關閉應用程序(它的進程)完成所有活動?

不,不應該。這是因爲活動不是應用程序的唯一組件。 Services,BroadcastReceivers仍然可以在沒有UI的情況下運行。通過使應用程序進程保持運行狀態,Android可以確保更快地響應用戶再次打開應用程序,或者更快地啓動服務等等,因爲不需要重新創建應用程序實例。

只有當您或其他應用程序顯式終止它或系統將其終止以釋放資源時,您的進程纔會被終止。

即使所有活動完成(關閉),變量的值仍然存在嗎?

您的變量位於Application類中,它跟隨一個Singleton模型,因此您的值將持續到整個應用程序進程終止。

此外,finish()只調用onDestroy(),它不是解構器,如解釋here。所以即使完成調用之後,即使Activity變量仍然存在,因爲您的實例仍然保留,直到Android覺得需要銷燬它,或者您的進程被終止。

爲了退出應用程序,調用System.exit(10)和Process.killProcess(Process.myPid())是否公平?

雖然這會殺死應用程序,但不推薦使用。關於這個問題的各種原因見this問題。

+1

+1爲鏈接提供並說明。 – Raghunandan 2013-03-21 10:24:21

0

Android將保留該進程直到它需要回收進程內存。這樣,如果用戶立即返回到您的應用程序,您的應用程序將顯得更快。

該值將一直持續到應用程序被終止。

不應該使用System.exit(10)和Process.killProcess(Process.myPid())退出應用程序?

你真的應該考慮不退出應用程序。這不是Android應用程序通常的工作方式。

2

爲您更新:

How can I clear the application constants on exit of the application(Back press of the HomeActivity)? 

覆蓋您HomeActivity內部和呼叫super.onBackPressed()清除所有變量之前onBackPressed。如果你有一個二傳手對位於您的應用程序子類中的字符串:

@Override 
public void onBackPressed() { 
    getApplication().setMyString(null); 
    super.onBackPressed(); 
} 

,如果你有足夠的狀態,以清除你可以寫一個方法至極重置所有領域,並稱之爲:

@Override 
public void onBackPressed() { 
    getApplication().clearAllMyFields(); 
    super.onBackPressed(); 
} 

中當然這些字段沒有被標記爲finalstatic final

相關問題