activity生命週期的乙個坑

2021-09-26 10:21:37 字數 858 閱讀 4870

今天專案中碰到乙個和activity生命週期有關的坑,特此記錄。

背景:activity launchmode="singleninstance",在多次啟動關閉後,在最後一次關閉(呼叫finish),生命只走到了onpause,此時再次launch後,這兩次的生命週期變成:oncreate--->onresume----->onpause------->oncreate---->onresume---->onstop----->ondestroy------>onpause

因為在onstop的時候,我會通過eventbus傳送訊息來結束自己,這就導致了bug現象:一直不能launch,看不到介面起來

解析:第乙個啟動的activity暫記錄為a,後面那次啟動記錄為b。雖說是singleninstance,但是在afinish呼叫後,雖說只到onpause沒有ondestroy,此時再次啟動,是另乙個物件b,通過this的log輸出可以看出。

因此生命週期其實是這樣:

oncreate(a)--->onresume(a)----->onpause(a)------->oncreate(b)---->onresume(b)---->onstop(a)----->ondestroy(a)------>onpause(b)

當a onpause時,又launch了b,b到onresume後,會call到a的onstop和ondestroy,在a的onstop會傳送訊息去finish,因為b也註冊了相同訊息,因此b剛被啟動就被finish了

方案:在oncreate時用local變數記錄當前activity物件,當onstop時,判斷如果local變數=this,則呼叫finish,否則不呼叫。這樣在a的onstop時,local變數已經變成b了,因此不會再發訊息去呼叫finish了

Activity生命週期

oncreate 設定activity所使用的布局檔案 按鈕繫結 等靜態設定操作 onstart 該activity能被我們看到的時候就會呼叫onstart onresume 能夠獲得使用者焦點 onpause 啟動另外乙個activity的時候就會呼叫第乙個activity的該方法 onstop ...

activity生命週期

乙個activity的啟動順序 oncreate onstart onresume 當另乙個activity啟動時 第乙個activity onpause 第二個activity oncreate onstart onresume 第乙個activity onstop 當返回到第乙個activity...

Activity 生命週期

activities 在系統中是以 activity 棧的形式被管理的。當乙個新的 activity 啟動時,它將會被放到棧的頂部並變成 running activity 上乙個activity 會被至於它的下面,在新 activity 存在期間它都不會到前端來。乙個 activity 有四個重要的...