2013-03-06 40 views
2

我已經有一個完整的應用程序,除了內存生命週期之外,我留下了最後一個。 事情似乎工作在所有情況下都不錯,但一:暫停和旋轉時的生命週期

  • 當我按電源按鈕的應用程序暫停,它正確地暫停和重啓恢復時。
  • 當我旋轉它正確調整大小的屏幕。
  • 當我I 暫停然後旋轉屏幕,其行爲是不同的,應用程序重置。

現在,顯然這是我的內部代碼的問題,但爲了幫助我進行調試,我想了解三個生命週期之間的區別。或者更好,如果第三個例子與前兩個例子有些不同。

調試,我看到所有這三個都這樣做(我像由心,我希望是正確的):

  • onSaveInstanceState()
  • onPause()
  • onStop()
  • onStart()
  • onResume()

是不是?或者我錯過了上面第三個例子中的一些生命週期步驟?

謝謝。

回答

3

請指定您的意思是應用程序重置

當你按下電源按鈕時,很有可能你的應用程序停止。這就是爲什麼你看到onStart()被叫停止(不是:暫停)您的應用程序。

鑑於這種情況,您描述的第三種情況是前兩種情況的組合嗎?換句話說,您如何在第三種情況下暫停您的應用程序?

更新關於您的評論:還有就是你的活動是停止和你的活動是破壞之間的差異。

旋轉是配置更改。在這種情況下,您的Activity將被銷燬並重新創建。如果您必須(取決於)onRetainNonConfigurationInstance()回調方法和getLastNonConfigurationInstance()方法,您可以單獨處理此案例。安卓呼叫onPause()onStop()onRetainNonConfigurationInstance()和順序onDestroy(),然後用onCreate()等繼續,它將處理任何事件,在此期間,使他們不會迷路。

最有可能的,你的一些代碼位於錯誤的回調,使得在第三場景中,一些沒有得到初始化/連接/ ...這是真的很難說沒有代碼異常(如果它是例外)。

我建議你按以下步驟操作。

  • 完成你的整個生命週期的理解和精確(創建,啓動,重啓,恢復,暫停,停止,銷燬)
  • 完成你的代碼覆蓋其他生命週期回調以及與日誌消息(唐」別忘了調用超類的回調),並分析暫停,停止,旋轉和組合
  • 確定墜機
  • 的角度分析在事故involvedd結合活動的生命週期對象的生命週期

或者你可以在這裏發佈一些代碼和例外,當然。

更新2我對AVD進行了測試。我觀察到以下內容:

當AVD處於橫向方向時,我按下電源按鈕,我的應用程序會收到縱向配置更改(大概是因爲縱向方向鎖定屏幕接管)。再次按下電源並解鎖AVD,應用程序會再次收到配置更改,回到橫向。

雖然沒有解決您的問題,但它表明代碼必須仔細放置在相應的回調中,因爲在上述情況下,在重新創建時,活動仍不會顯示,顯示爲

如果更新您的問題,請給我評論。

+0

所有的測試都是在模擬器上進行的。在第三次測試中,我按下電源按鈕,等待屏幕鎖定,旋轉屏幕並將其解鎖。很顯然,這種情況與我只是旋轉屏幕或簡單地鎖定屏幕並將其解鎖的​​情況有所不同。 在前兩種情況下,我總是發現onStart()是運行的,所以我認爲這三項活動都被銷燬了。但爲什麼會有差異? – 2013-03-06 09:13:34

+0

@BeppiMenozzi我已經更新了我的答案。 - 吉茲,我不知道爲什麼有人低估了它。可能是沒有掌握這個主題的人。或者有人點擊了錯誤的箭頭。 – 2013-03-06 09:33:46

+0

你的回答並不是絕對值得讚賞的,我投票補償:)當然是因爲這是一個很好的答案。 – 2013-03-06 10:13:06

0

方向更改時重新創建活動。

android:configChanges="keyboardHidden|orientation"添加到清單中的activity

+0

OP說他已經正確管理屏幕旋轉。請詳細說明你的建議如何在這些情況下改善他的狀況。 – 2013-03-06 09:02:54

+0

謝謝。我會試試這個。但是,如果在暫停應用後旋轉屏幕,我不明白與在應用運行時旋轉屏幕有什麼不同。 – 2013-03-06 09:08:55

+1

@BeppiMenozzi請不要試試這個。這是不好的做法。 – 2013-03-06 09:11:57