簡體   English   中英

活動生命周期中“可見性”指的是什么? onPause vs onStop?

[英]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通知,並發現了一些額外的怪異:

  1. 按Home鍵將始終調用onStop()。 但是啟動應用程序不會調用onRestart() 相反,它調用onCreate() 這對我來說很奇怪,但好吧......
  2. 在主活動之上啟動“USB Mass Storage”活動時,將onStop() 退出usb存儲活動時,返回主活動, onRestart() ,而不是onCreate()
  3. 當設備進入休眠模式並被喚醒時,活動僅通過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()來檢測狀態欄下拉

如何使用OnWindowFocusChanged方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM