Activity生命週期,學習筆記(踩過的坑)

關於Activity的生命週期問題,已經是很常見、很簡單的問題了,但是偶爾還是會踩坑。這裏,做個總結、筆記

1、一個APP啓動,啓動後退到後臺(home鍵),然後重新打開界面。這個過程是生命週期變化是什麼?

這個問題非常簡單了

APP啓動
onCreate
onStart
onResume

退到後臺
onPause
onStop

重新打開
onRestart
onStart
onResume

2、兩個界面的跳轉呢?
第一個界面,跳轉第二個界面startActivityForResult,然後關閉第二個界面,回到第一個界面setResult、finish()

打開APP,展示第一個界面
第一個界面: onCreate
第一個界面: onStart
第一個界面: onResume

跳轉第二個界面
15:59:24.062 第一個界面: onPause
15:59:24.101 第二個界面: onCreate
15:59:24.104 第二個界面: onStart
15:59:24.105 第二個界面: onResume
15:59:24.522 第一個界面: onStop

關閉第二個界面,回到第一個界面
16:00:48.703 第二個界面: onPause
16:00:48.718 第一個界面: onActivityResult ; requestCode = 1 ; resultCode = 2
16:00:48.719 第一個界面: onRestart
16:00:48.720 第一個界面: onStart
16:00:48.720 第一個界面: onResume
16:00:49.117 第二個界面: onStop
16:00:49.118 第二個界面: onDestroy

注意:
1、第一個界面的onStop,是在第二個界面展示後,大約400毫秒以後(這裏,我的demo是空界面,具體時間,可能和界面複雜度有關)
2、第二個界面回到第一個界面時,onActivityResult 先於onResume處理

爲什麼呢?看下 onActivityResult 的源碼,這個方法上的說明:

......
......

<p>You will receive this call immediately before onResume() when your
activity is re-starting.
你將在onResume()之前立即收到這個電話,當你的
活動重新開始。

<p>This method is never invoked if your activity sets
{@link android.R.styleable#AndroidManifestActivity_noHistory noHistory} to
<code>true</code>.

 ......
 ......

假設現在有個功能需求:
1、在A界面,有個單詞讀音功能,要求在界面停止的時候,關閉讀音;
2、A界面上,有個按鈕,去到B界面,B界面上有個單詞,要求界面展示後自動發音。

分析:
1、A界面,界面停止時關閉讀音,那就是 onStop 的時候關閉讀音;
2、隱藏條件:項目中,讀音控制器,是單例的,只有一個。即:單詞A發音時,B單詞讀音前觸發了關閉條件,A單詞讀音立刻停止

如果功能開發時:
A界面單詞正在讀音,在A的 onStop 中進行了cancel 操作;跳轉到了B界面,B界面單詞自動發音,會出現B界面沒有讀音效果問題。原因就是,A界面的onStop,在B的onResume後執行,B單詞正在發音的時候,A把它關了。

解決辦法:
B單詞界面讀音時:

view?.postDelayed({
	......
}, long delayMillis)

delayMillis:毫秒值

延遲一點時間後,再執行相關功能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章