兩個Activity之間重複相互跳轉時遇到的坑

2021-08-18 18:48:43 字數 2338 閱讀 3473

最近在做的乙個應用,主體為兩個activity,互動時需要來回在兩個activity之間跳轉,首先act a先啟動,然後act a啟動act b,之後act b可以通過startactivity()(沒有其他方法了吧?)再次回到act a,同樣在act a也可以再次進入act b;其中a、b我們只需要初始化一次,也就是oncreate()方法只執行一次,後續重複使用已存在的act a,b例項。

看似很簡單的要求,我首先想到的就是兩個activity的launchmode都設定為singletask。

在singletask

模式下,

task

棧中將只會存在乙個該

activity

的例項。而在standard模式下,重複使用intent啟動activity將新建新的activity例項,也就是oncreate()將得到執行,此時task中將存在多個相同的activity例項,明顯不滿足要求,使用singletask模式貌似能避免這個問題。

使用singletask後重複例項的問題是解決了,task棧中確實只同時存在乙個act a和act b例項,但通過除錯發現,當下面跳轉(

→表示啟動)

act a→ act b → act a

跳轉後,

act b

的ondestroy()

方法被呼叫,也就是

act b

被銷毀了,在

act a→ act b → act a → act b

時,第二次啟動act b時

oncreate()

被呼叫,此時

act b

非彼act b

,是乙個全新的例項。

仔細檢視相關資料後發現,在乙個

task

中,activity

例項以棧的形式儲存,棧這種資料結構的特點是先進後出。通常乙個

有乙個預設

task

,在activity的launchmode都為singletask時,第一次act a → act b

後,act b在棧頂,act a在棧底;act a→ act b → act a

時,由於

act a

例項已經存在,不必新建只需調到棧頂,重點來了,此時

act a

之上的activity

例項都會被移除,直到

act a

處於棧頂。到我們再次啟動

act b

,由於棧內已經沒有

act b

的例項,將會重新新建乙個

act b

的例項壓入棧頂。

問題的原因知道了,那怎麼解決呢 

既然act a,b

處於同乙個棧層疊時會發生移除棧頂的問題,那能不能分別為a,

b指定在不同的

task

棧呢?這樣明顯也是可行的,這種情況下,

act a,b

分別處於不同的棧,每乙個棧都最多隻存在乙個例項。但後來發現用這種方法明顯大材小用了。我當時是這樣做的:

在androidmanifest.xml

中為activity b

指定android

:taskaffinity=

"daily.task.test"

然後在

activity a

啟動activity b

的intent

新增flag:

intent.

flag_activity_new_task

此時存在兩個task

,兩個activity都啟動後,直觀感受就是乙個應用在後台卡片列表中存在兩個卡片。像這樣:

後來又仔細看了許多資料介紹,在這篇部落格

(感覺大神們的收集和整理)

中注意到這個flag:
intent.flag_activity_reorder_to_front

表示「如果這個

activity

已經啟動了,就不產生新的

activity

,而只是把這個

activity

例項加到棧頂「。這正是我們需要的

索性刪除

taskaffinity,launchmode都改為改為standard,啟動時的intent都新增上flag:

intent.flag_activity_reorder_to_front

問題完美解決

封裝類中實現另外兩個Activity之間的跳轉

1.在乙個封裝類中實現另外兩個activity之間的跳轉時,要在類中宣告當前要跳轉的頁面。定義activity類,宣告mainactivity,命名任意 activity mainactivity 設定set方法用來對它賦值 public void setmainactivity activity ...

兩個Activity之間的觀察者模式

需求是在閃屏頁面啟動定位功能,在mainactivity中更改位置資訊。如果定位功能在mainactivity生成之前完成。則在mainactivity初始化時就有位置資訊。若由於網路原因等在mainactivity生成之後才完成定位,這時候需要通知mainactivity改變定位資訊。就涉及到了觀...

python 兩個list之間判斷是否有相同值

例項 axis 4 slot 1 2,3 4,5 6 atwill7 false for i in axis if i not in slot if atwill7 print 假 else print 真 下列 詳解 1 用 i 去遍歷第乙個列表 axis 如果 i 不在第二個列表 slot 裡面...