首先要知道的概念是 棧 這個(gè)一般都知道的了,然后隧甚,Android中activity的裝載方式就是使用的棧的方式的车荔。
相信大家經(jīng)常會(huì)遇到這樣的一種情況
在某個(gè)activity中點(diǎn)個(gè)按鈕,然后跳的另一個(gè)activity戚扳,但是要finish掉之前的所有activity
(你說(shuō)你沒遇到忧便? 反正我是遇到了)
最經(jīng)典的例子就是,那個(gè)坑爹的退出登錄一般是在一個(gè)叫 SetActivity 里面帽借,可是這個(gè)SetActivity 是 MainActivity 跳過(guò)來(lái)的珠增,點(diǎn)擊退出登錄,可以干掉的是 SetActivity 然后跳到 LoginActivity,但是 MainActivity 還在砍艾,不符合跳轉(zhuǎn)邏輯啊蒂教。
文字描述有點(diǎn)累贅,換個(gè)抽象的
定義
S:SetActivity
M:MainActivity
L:LoginActivity
開始是
M,S
退出登錄是
M,L
再登錄是
M,L,M
多了個(gè)M
這還是只多了一個(gè)的情況脆荷,挺好解決的
問(wèn)題是我遇到的是多了N多個(gè)activity在中間凝垛,分分鐘跳轉(zhuǎn)就亂了
解決的辦法有3種
第一種:用個(gè)list裝起來(lái)全部的activity,每次打開一個(gè)activity的時(shí)候傳個(gè)context進(jìn)去,finish的時(shí)候移除就好苔严,可以用BaseActivity封裝好也不是特別麻煩定枷,要干掉全部的時(shí)候,一個(gè)循環(huán)就干掉了届氢,詳細(xì)的代碼百度下就好
第二種:用廣播欠窒,就是之前寫的RxBus或者eventBus,或者自己寫退子,要退出了發(fā)送個(gè)退出的廣播岖妄,要關(guān)掉的activity注冊(cè)個(gè)監(jiān)聽接收廣播后finish掉就好。一開始我也是這么干的寂祥,后來(lái)中間多了太多activity了荐虐,代碼差點(diǎn)亂套。
第三種:這種其實(shí)才是最正宗的
辣就是設(shè)置啟動(dòng)方式
其實(shí)一直都知道activity的啟動(dòng)方式有4種
standard 這個(gè)是默認(rèn)的丸凭,正常都用這種
singleInstance這個(gè)是坑爹的福扬,一般不用,也最好不要亂用惜犀,它會(huì)新建多一個(gè)棧
手機(jī)查看所有啟動(dòng)應(yīng)用的窗口再一鍵清除的嘛铛碑,具體表現(xiàn)就是用了以后,這里會(huì)有2個(gè)窗口虽界。反正不用就是了
singleTop這個(gè)很不錯(cuò)
比如默認(rèn)就是
A-B-C-D-D-D-D
用了這個(gè)后就是
A-B-C-D
D這個(gè)activity再打開自己汽烦,就不會(huì)new一個(gè)了,就會(huì)一直用自己這個(gè)
但是··············
不會(huì)重新調(diào)用
onCreate
而是調(diào)用
onNewIntent
這個(gè)方法了莉御,所有新的數(shù)據(jù)啊什么的要放這里面
比如我傳值過(guò)來(lái)
@Override
protected void onNewIntent(Intent intent) {
//data= getIntent().getStringExtra("數(shù)據(jù)"); //坑點(diǎn)
String data = intent.getStringExtra("數(shù)據(jù)"); //注意點(diǎn)
super.onNewIntent(intent);
}
getIntent()是之前的intent數(shù)據(jù)
新打開的intent的數(shù)據(jù)是(Intent intent)這里面intent的數(shù)據(jù)
好撇吞,最后一種,也是題目能解決結(jié)束多個(gè)activity的這種
好東西總要壓軸嘛
singleTask就是你了
它的功能就是
如果要啟動(dòng)的Activity不在礁叔,就創(chuàng)建新的然后放到棧頂牍颈。
如果要啟動(dòng)的Activity已經(jīng)在棧頂,就跟singleTop模式一樣晴圾。
如果要啟動(dòng)的Activity已經(jīng)在于棧中颂砸,就會(huì)干掉這個(gè)Activty上面的所有其他Activty。
舉個(gè)栗子:
1.A-B-C-D------E
A-B-C-D-E
2.A-B-C-D------D
A-B-C-D------D
3.A-B-C-D------B
就變成
A-B
就是這么炫酷
好回到上面的那個(gè)難題
開始是
M,S
退出登錄是
M,L
再登錄用了這個(gè)以后就是
M,L-----M就只剩下了M
雖然退出登錄并不能結(jié)束全部activity然后跳到LoginActivity死姚,
但是這樣的邏輯才是最正確的人乓,再登錄以后就一切正常了。
講了這么多怎么樣設(shè)置才是重點(diǎn)
其實(shí)出乎意料的簡(jiǎn)單
就是在manifest里面
<activity
android:name=".******.****.*******"
android:launchMode="singleTop" //這就行了
android:screenOrientation="portrait" //這個(gè)是豎屏顯示都毒,表示不能橫屏
android:theme="@style/AppTheme"/>
當(dāng)然也可以在intent跳轉(zhuǎn)的時(shí)候給intent加個(gè)Flag色罚,你喜歡就好,反正我不想那樣加
clearTaskOnLaunch
話說(shuō)這個(gè)也是管理activity棧的很有意思账劲,雖然用不到戳护,有興趣可以去找找