遇到問(wèn)題聂儒,部分手機(jī)安卓部分手機(jī)后臺(tái)打開(kāi)開(kāi)屏頁(yè)贝或,然后再跳到之前頁(yè)面荸镊。
1.出現(xiàn)原因
應(yīng)用A 通過(guò)包名啟動(dòng)應(yīng)用B,此時(shí)的intent是啟動(dòng)意圖,
應(yīng)用B B_1頁(yè)面啟動(dòng)后唉韭,啟動(dòng)主頁(yè)B_2,同時(shí)關(guān)閉B_1沸伏,返回多級(jí)調(diào)整【B_2_B_3…>Bn】
返回桌面缩搅,點(diǎn)擊圖標(biāo)啟動(dòng)B,此時(shí)的intent是啟動(dòng)意圖復(fù)用創(chuàng)建時(shí)的intent猖腕,重新啟動(dòng)B拆祈,【B_2_B_3…>B_1】,因?yàn)锽_2的啟動(dòng)模式singleTask倘感,棧內(nèi)唯一放坏,B_2重用,并移除棧上的B_n等頁(yè)面老玛,造成上層的頁(yè)面關(guān)閉淤年,而B(niǎo)_2仍然正常,即回到應(yīng)用主頁(yè)
2.修復(fù)方式
啟動(dòng)B_1頁(yè)面時(shí)蜡豹,判斷其棧內(nèi)是否有其他頁(yè)面使用麸粮,使用isTaskRoot()判斷是否是棧底的頁(yè)面,僅且正常開(kāi)啟才會(huì)在棧底镜廉,而當(dāng)從其他app跳轉(zhuǎn)時(shí)弄诲,如果棧內(nèi)已有活動(dòng)頁(yè)面,不做處理即可。
而從柯元旦所著的《android內(nèi)核剖析》一書(shū)中有記錄如下規(guī)則:
每次啟動(dòng)Intent導(dǎo)致新創(chuàng)建Task的時(shí)候齐遵,該Task會(huì)記錄導(dǎo)致其創(chuàng)建的Intent寂玲;而如果后續(xù)需要有一個(gè)新的與創(chuàng)建Intent完全一致(完全一致定位為:?jiǎn)?dòng)類,action梗摇、category等等全部一樣拓哟,不可多項(xiàng)也不可缺少),那么該Intent并不會(huì)觸發(fā)Activity的新建啟動(dòng)伶授,而只會(huì)將已經(jīng)存在的對(duì)應(yīng)Task移到前臺(tái)断序;這也就是為什么桌面會(huì)在再次點(diǎn)擊圖標(biāo)時(shí)將后臺(tái)任務(wù)挪到前臺(tái)而不是重新啟動(dòng)App的實(shí)現(xiàn)
3.實(shí)際上現(xiàn)在有些手機(jī)只要退到后臺(tái),再回來(lái)就依然復(fù)現(xiàn)
if (!isTaskRoot()) {//// 判斷當(dāng)前activity是不是所在任務(wù)棧的根
Intent intent = getIntent();
if (intent != null) {
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
finish();
}
}
}