關於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連結↑↑↑