2015-06-01 40 views
0

我寫了一個遊戲,而從市場的日誌我有時會看到下面的模式:不尋常的Android活動的生命週期

06:02:13:835|INFO|1|MainActivity|MainActivity#2.OnCreate 
06:02:13:932|INFO|1|MainActivity|MainActivity#2.OnStart 
06:02:14:010|INFO|1|MainActivity|MainActivity#2.OnResume 
... 
06:09:27:688|INFO|1|MainActivity|MainActivity#2.OnPause 
06:09:28:895|INFO|1|MainActivity|MainActivity#3.OnCreate 
06:09:29:159|INFO|1|MainActivity|MainActivity#3.OnStart 
06:09:29:319|INFO|1|MainActivity|MainActivity#3.OnResume 
06:09:29:551|INFO|1|MainActivity|MainActivity#2.OnStop 
06:09:29:596|INFO|1|MainActivity|MainActivity#2.OnDestroy 

MainActivity實例#3創建和MainActivity實例#2被破壞之前啓動。這種模式意味着什麼?爲什麼新實例在之前已經被銷燬?

顯然我不會手動創建活動。用戶只需點擊圖標即可開始遊戲(至少我希望如此)。

活動具有singleTask啓動模式。

謝謝!

回答

1

onDestroy回調不保證被調用。從docs

的onDestroy()=收到之前,你的活動是 破壞最後的通話。這可能是因爲活動正在完成 (某人稱爲finish()或者因爲系統暫時爲 銷燬此活動的實例以節省空間。您可以使用isFinishing()方法區分這兩個方案。

+0

onDestroy被調用。但比我想要的晚。 例如,我在開始打開文件,在停止關閉。 糟糕的是,我無法在新活動中打開相同的文件,而它被之前的實例鎖定。所以我想了解這種生命週期模式,我該如何避免它 – Grigory

+0

你需要在onPause()回調中「清理東西」(如文件鎖定),這是當你的活動進入後臺時調用的方法(包括當你切換到另一個活動)。注意onPause()保證被調用。 –

+0

@Grigory,你解決了你的問題嗎? –

1

假設你的應用程序有兩個活動,那麼這將是生命週期,如果你顯式調用

enter image description here

的onDestroy將被調用完();你自己或者如果你按下返回按鈕就是這個例子,因爲按回來鍵實際上會激發你的活動的finish()方法,並且它會導致你的活動被暫停 - >停止 - >銷燬

+0

但是我只有一個singleTask啓動模式的活動。在停止第一個實例之前,系統如何創建並啓動另一個實例? – Grigory

+0

我認爲這個鏈接可以幫助您用singleTask活動解決您的問題。在文檔中說SingleTask似乎不像android文檔中描述的那樣工作,但是顯示了一種方法來執行它http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en –