![](/img/trans.png)
[英]onPause() and onStop() of Activity lifecycle methods not being called
[英]What does “visibility” refer to in the Activity Lifecycle? onPause vs onStop?
活動生命周期給我帶來了麻煩。 http://developer.android.com/reference/android/app/Activity.html上的文檔在描述可見性的概念時非常模糊,我無法弄清楚當onStop()
被調用vs onPause()
。
比較文檔中的以下兩個語句:
(從生命周期圖右下方拍攝)
onStart()
和onStop()
方法可以多次調用,因為活動對用戶可見並隱藏。
VS
(進一步在藍色表中的“可填充”列)
onPause()
在系統即將開始恢復上一個活動時調用。
我從第一個引文中理解的是,當A
被“隱藏”時, onStop()
在活動A
上被調用。 “隱藏”我猜是指另一個活動B
何時恢復並且完全覆蓋了活動A
但是第二個引用然后聲明當另一個活動即將開始恢復時調用onPause()
。 這不會完全隱藏活動A嗎? 兩種情況似乎都暗示A
活動變得“隱藏”,不是嗎? 根據我可能的錯誤解釋,在相同的情況下調用onPause()
和onStop()
。
隱藏( onStop()
被調用)和部分可見性(調用onPause()
之間的文檔似乎也有所不同。 但什么時候活動仍然部分可見? 它們是字面意思嗎? 或者當一個活動啟動一個覆蓋整個屏幕的新活動(活動調用startActivityForResult並啟動日期選擇器活動)時,它仍然可以被視為“部分可見”嗎? 當然,活動不會被onStop調用? 它應該隨時收到結果!
所以我想弄明白我沒有得到什么。 我知道對onPause的調用是有保證的。 那就是當活動A
失去焦點(設備進入睡眠模式,屏幕鎖定等)時,不同的活動B
占據前景(其中活動B
可能已經或可能沒有被活動A
發起)。 但是在活動A
上調用了onStop()
?
在活動堆棧上活動A上堆積了多少活動? 是否有兩種不同的“可見性”定義?
抱歉文字的牆,但我真的很沮喪:S
所以問題就在於:確切地說,哪種情況是被視為“隱藏”的活動,以便在其上調用onStop()
?
編輯:
我在每個onX方法中插入了Toast通知,並發現了一些額外的怪異:
onRestart()
。 相反,它調用onCreate()
。 這對我來說很奇怪,但好吧...... onStop()
。 退出usb存儲活動時,返回主活動, onRestart()
,而不是onCreate()
。 onPause()
和onResume()
循環。 最后一點是預期的(雖然我不能讓它適合生命周期圖)。 但最新的是1.和2.?
在第一點,我期待在再次啟動活動時調用onRestart()
。 為什么要取消分配活動並調用onCreate()
呢?
並看看第2點:根據文檔:當“另一個活動出現在活動前”時,應該調用onPaused()
。 這不是USB存儲活動出現時發生的事情嗎? 它沒有調用onPause()
,它經歷了onStop()
- OnRestart()
循環! 顯然,文檔沒有考慮“另一項活動出現在活動前”的情況。 那真的發生了什么?
好的,我想我現在已經有了這個。
1。
第一點的關鍵是這個鏈接:
http://code.google.com/p/android/issues/detail?id=2373
這是一個錯誤。 鏈接中的一些代碼已經完全解決了創建新根活動實例的問題,而不是僅僅重新啟動上一個活動活動(在按下主頁按鈕之前)。
我把代碼放在onCreate方法的頂部,就在super.onCreate調用的下面:
if (!isTaskRoot()) {
final Intent intent = getIntent();
final String intentAction = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
finish(); return;
}
}
請注意,我在完成后添加了return語句,因此在檢測到錯誤的情況下,onCreate方法的其余部分不會運行。
2.&3。
第二點和第三點的關鍵是這兩個鏈接:
http://answers.oreilly.com/topic/2692-android-programming-understanding-the-activity-life-cycle/
事實證明,“可見性”確實是字面上的! 因此,當文檔說“另一項活動出現在活動前”時,碰撞活動背后的活動仍然是部分可見的。 這意味着Android活動管理器必須檢查碰撞的活動是否是全屏活動:如果是,則在上一個活動上調用onStop()
。 如果沒有,則在之前的活動上調用onPaused()
。
這簡單地解釋了為什么USB存儲管理器導致onStop()
。
這也意味着當設備進入睡眠模式時,活動管理器會將其視為非全屏活動,即使技術上主要活動完全隱藏在其后面。
(請參閱有關如何進行非全屏活動的第二個鏈接)
有趣的是,下拉窗口(帶有通知)不會調用onPause()
(也不會調用onStop()
),即使它作為非全屏活動也是有意義的。 這必須是我將自己調查的某種例外。
這也意味着onStop()-onRestart()
循環可能比onPause()-onResume()
循環更常見(盡管兩者都必須考慮),因為活動可能更多是全屏活動(就個人而言,我認為文檔表明了相反的意思:onPause-onResume更常見,但也許就是我。
此外,這必須意味着當主活動為結果啟動新的全屏活動時,主活動將首先停止,然后在結果檢索活動完成時重新啟動。
所以現在唯一的問題是如何最好地處理被解除分配的暫停活動(意思是,它被非全屏活動覆蓋)(盡管這種情況很少見)。 可能會遇到什么挑戰?
但這超出了這個問題的范圍。
最后跟蹤了這個:你可以使用onWindowFocusChanged()來檢測狀態欄下拉
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.