活動生命週期令我頭疼。 http://developer.android.com/reference/android/app/Activity.html的文檔在描述可見性的概念時非常模糊,我不知道onStop()
被調用的時間與onPause()
的時間有關。「可見性」在「活動生命週期」中指的是什麼? onPause vs onStop?
比較下列兩個語句從文檔:
(右拍攝的生命週期圖表下方)
的
onStart()
和onStop()
方法可以被調用多次,如 的活性變得可見並隱藏給用戶。
VS
(藍色表進一步打倒 「killable」 列)
onPause()
當系統即將開始恢復以前的活動調用。
我從第一次報價明白了什麼,是onStop()
被稱爲上的活動A
當A
爲「隱藏」。 「隱藏」我想是指當另一個活動B
已被恢復,並完全覆蓋活動A
。 但是第二個報價表明當另一個活動即將開始恢復時,將調用onPause()
。這不會完全隱藏活動A嗎?這兩種情況都似乎意味着那個活動A
變得「隱藏」了,不是嗎?根據我可能的錯誤解釋,在相同的情況下調用onPause()
和onStop()
。
隱藏文檔(onStop()
被調用)和部分可見性(onPause()
被調用)之間似乎也有所不同。但是什麼時候活動仍然部分可見?他們的意思是字面意思嗎?或者,當一個活動啓動了一個覆蓋整個屏幕的新活動(活動調用startActivityForResult並啓動日期選擇器活動)時,它仍然可以被視爲「部分可見」?當然,活動不會在onStop調用?它應該會在任何時候收到結果!
所以我想弄清楚我沒有得到什麼。 我知道打電話給onPause是有保證的。當活動A
失去焦點(設備進入睡眠模式,屏幕鎖定等)時,活動B
採取前景(其中活動B
可能已經或可能未被活動A
啓動)。 但是在哪一點上是在活動A
上調用onStop()
?
是否在活動堆棧的活動A上堆積了多少活動?遊戲中有兩種不同的「可視性」定義嗎?
對不起文本牆,但我真的很沮喪:S
所以問題表示:正是在這種情況下,是一個活動視爲「隱藏」,使得onStop()
叫上了嗎?
編輯:
我插入Toast通知在每個ONX方法,並發現了一些額外的怪事:
- 按下Home鍵將總是調用的onStop()。但啓動應用程序不會調用
onRestart()
。相反,它調用onCreate()
。這對我來說似乎很陌生,但好吧... - 當在主要活動之上啓動「USB Mass Storage」活動時,調用
onStop()
。當退出USB存儲活動時,返回到主要活動onRestart()
被調用,而不是onCreate()
。 - 當設備進入睡眠模式並且被喚醒時,活動只會經歷
onPause()
和onResume()
循環。
最後一點是期待的(雖然我不能讓它適應生命週期圖)。但最新的1.和2.?
第一點,我期待在再次開始活動時撥打onRestart()
。爲什麼要取消分配活動並改爲撥打onCreate()
?
然後看看第2點: 根據文檔:當「另一項活動出現在活動前面」時,應該調用onPaused()
。 USB存儲活動出現時發生的情況不是這樣嗎?它沒有叫onPause()
,它經歷了onStop()
- OnRestart()
週期!很顯然,文件並不認爲「另一項活動出現在活動前」的情況。那麼究竟發生了什麼?
你提到,你將不能夠相信日誌,因爲可能的onStop不被調用。只有在Android對資源至關重要並且決定需要您的Activity正在使用的資源的極端情況下,纔會發生這種情況。大部分時間你都可以信任日誌。 – Juan 2011-12-27 07:04:32
根據文檔,活動資源的釋放將首先發生onStop或onPause被調用(在onPause之後解除分配是一種非常罕見的情況)。從圖中暫停到停止的轉換觸發器是「活動不再可見」。所以它似乎不適合你的帖子。 – uhmdown 2011-12-27 10:04:17
我可能誤解了你的帖子,胡安。也許你只是指在onPause之後執行取消分配的情況。但是,日誌記錄可能會告訴我什麼時候在個別情況下調用onStop,但它不會讓我全面瞭解何時應該或不應該調用onStop。 – uhmdown 2011-12-27 11:26:16