1. 程式人生 > >關於Activity中onStop和onPause呼叫時機的各種誤解

關於Activity中onStop和onPause呼叫時機的各種誤解

原始碼 : https://github.com/w-g-b/ActivityReview

正確結果

假設當前的FirstActivity為A,要呼叫A的onPause方法而不呼叫onStop方法

 

1. 在AndroidManifest檔案中,將ThirdActivity(B)的theme屬性設定為對話方塊樣式(也可以使用自定義主題,也不必一定是對話方塊,也可以設定成透明樣式的Activity)

2. 在A中通過startActivity啟動B,這個時候就只會呼叫A的onPause方法,並會呼叫B的onCreate,onStart,onResume方法

3. 關閉B時,只會重新呼叫A的onResume方法

目前我的測試也就只有這種情況下才會只調用A的onPause方法,而不呼叫onStop方法

 而會呼叫onStop方法的情況則比較多,比如: 鎖屏,按Home返回桌面,來電,或者像微信PC端請求登入時,客戶端突然蹦出現的確定資訊 ,都會呼叫onStop方法

有關onStop和onPause時機的各種誤解

網上很多人說,當彈出對話方塊時會呼叫onPause方法或者說活動可見但被遮擋而不能互動時,會呼叫onPause,所以做了如下的測試,證明這種說法是錯的

1. 當發生彈窗,或者彈吐司(Toast)的時候,並不會呼叫onPause方法

2. 當有新訊息,比如說新簡訊提醒或者像微信那種新資訊提示時,也不會呼叫onPause方法

3. 這個也是有利的證據,下拉Android系統自帶的通知欄,此時當前Activity被遮擋,並且無法進行互動,但是仍然沒有呼叫onPause方法

而關於onStop的說法是,當Activity不可見的時候會呼叫onStop方法,這裡也舉個反例。通過將對話方塊主題的Activity設定為全屏並且是可見的,觀看列印結果

這裡使用自定的對話方塊樣式:

1. 在模組/src/main/res/values/styles.xml新增一個新的樣式:

2. AndroidManifest中設定該theme

3. 程式碼中實現全屏

4. 如果說狀態列還在有影響,則可以新增如下程式碼,隱藏掉狀態列

5. 此時,啟動該對話方塊樣式的Activity則是全屏的,完全遮擋了後面的Activity

6. 此時的列印資訊,仍只會呼叫前面那個Activity的onPause方法

 另外還有一種比較神奇的現象:就算是跳到其他頁面,使得該Activity完全不可見,也不會呼叫該的onPause, onStop方法

1. 首先得是MIUI系統,其他系統我不清楚有沒有這功能

2. 使用系統自帶的截圖功能截圖,此時會截完圖會出現一個縮圖在右上角展示

3. 點選縮圖跳轉,進入圖片處理介面,此時改介面完全遮蓋了原有的Activity

4. 按返回鍵返回原來的介面

在這整個過程當中,並不會呼叫onPause或者onStop方法。

當然,如果你在圖片處理介面點選了傳送或者美化,才會開始呼叫原Activity的onPause和onStop方法

感覺網上的資訊真的是太多太複雜了,不一定可信,還是需要自己親自測試一下,才能驗證結果。程式碼已上傳,詳解上面的github連結↑↑↑