1

根據Android活動生命週期,活動不再可見時onStop將被調用。但是,如果我很快退出第二個活動,這不會發生。當第二活動開始時第一活動不會停止

我有兩個活動HomeActivityDetailActivity

步驟1.按上HomeActivity可前往[一鍵DetailActivity

步驟2。按DetailActivity導航到HomeActivity

當導航到DetailActivityHomeActivityonStop應該得到所謂的每個活動的生命週期,因爲DetailActivity得到onStart。 但onStop沒有得到調用,如果我快速按DetailActivity

活動的生命週期,如果馬上回來按下..

HomeActivity: onPause 
DetailActivity: onStart 
DetailActivity: onResume 
DetailActivity: onPostResume 
DetailActivity: onPause 
HomeActivity: onResume 
HomeActivity: onPostResume 
DetailActivity: onStop 

活動的生命週期,如果後面的延遲後按(說幾秒鐘後上DetailActivity)

HomeActivity: onPause 
DetailActivity: onStart 
DetailActivity: onResume 
DetailActivity: onPostResume 
HomeActivity: onStop 
DetailActivity: onPause 
HomeActivity: onStart 
HomeActivity: onResume 
HomeActivity: onPostResume 
DetailActivity: onStop 

不這個模樣作爲新的Activity的錯誤已啓動,以前的活動不會停止?

+2

如果你沒有完成第一個活動它將保持在後臺,只有onPause方法將被觸發。這是正常的行爲,在startActivity(...)後立即使用finish() – Chol

+0

@Chol-不,那不是。如果''DetailActivity'上的背按不快,'HomeActivity'就會變成'onStop'。只有當您立即按回 – Libin

+0

時,纔會出現問題,除非以前的活動不完全不可見。 – sanemars

回答

-1

你已經描述了正常的行爲。下面是https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle說一下:

當活動不再對用戶可見調用,因爲 另一個活動已經恢復並且覆蓋這一個。這可能是因爲一個新的活動正在開始,現有的 被帶到這個活動的前面,或者這個活動正在被銷燬。 如果此活動回到 與用戶進行交互,或onDestroy()(如果此活動消失),則跟在onRestart()後面。

所以,你可能想知道,如果我的新活動是可見的,那不是說以前的活動是不可見的嗎?不是真的。你的新活動可能不完全重疊舊活動(在這種情況下,舊活動的一部分仍然可見)。如果舊活動具有對用戶「不可見」的元素,這可能會特別棘手,因爲它們看起來與新活動中的元素相同,在技術上仍然可見(因爲它們並未被新元素完全阻止)。

除了可見性外,您還可能無意中使用生命週期方法來計算導致此問題的問題。假設你的onPause()需要很長時間才能完成。另一個活動可以完全隱藏舊的,滿足onStop()的條件,但是在onStop()有機會運行之前轉換回來。

最後,有很多任務需要在手機上運行,​​並且有很少的處理器可以執行它們。必然有些任務比其他任務具有更高的優先級。考慮一下當新活動佔據前臺時必須執行的代碼 - 如果手機忙於爲您的活動執行代碼,onStop()沒有時間運行。如果該代碼然後觸發onResume,onStop將被完全跳過。從生命週期圖中可以看到,您可以在不通過onStop()的情況下從onPause()過渡回onResume()。也許你應該考慮一下類似的情況,以便更好地理解你的特定情況(以及爲什麼)。

+0

我的兩項活動都是全屏佈局,所以不存在「可能不完全重疊舊版」的問題。除了日誌以外,我不會在'onPause'上執行任何操作。這聽起來像是活動進行到onStart,它需要活着幾秒鐘,然後再移動到onPause,如果不是以前的活動不會獲得'onStop'。這似乎是我的一個bug,這就是爲什麼我不清楚 – Libin

+0

我不知道你爲什麼認爲這是一個錯誤。好像你對操作系統的工作原理有一個簡單的(和不正確的)看法。從本質上講,您的兩項活動並不是在給定電話上運行的唯一事物,它們不一定具有相同的優先級(或獲得執行時間的機會)。有很多事情需要運行,並且運行它們的CPU數量要少得多。必然有些任務會比其他任務更優先。所以,你不應該期望onStop()會在活動變得隱藏的時候被調用。你所看到的是你應該期待的。 – iheanyi

+0

@libin看看生命週期圖。正如你所看到的,你可以從onPause()返回onResume()而不需要通過onStop()。 Yous似乎認爲你可以保證在onPause()後打onStop()。 – iheanyi

0

According to Android Docs有關的活動

用戶的停止和重新啓動執行你的應用程序,啓動一個新的活動的訴訟。當第二個活動創建時,當前活動停止。如果用戶然後按下「後退」按鈕,則重新啓動第一個活動。

他們應該更新它說If the user the presses the Back button but not to quickly哈哈,但我認爲iheanyi是正確的,其他一些過程可能已經獲得CPU時間的事實後DetailsActivity打onPostResume並按下後退按鈕之前的OS可以繼續與onStop進程的HomeAcitvity

相關問題