最近在做的乙個應用,主體為兩個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 裡面...