Activity之 isTaskRoot()

App打包apk安裝后重復(fù)啟動(dòng)根界面的問(wèn)題

這個(gè)問(wèn)題很特殊蝇摸,一般情況下很難被發(fā)現(xiàn)壤圃,是Android系統(tǒng)一直以來(lái)的一個(gè)Bug夹孔。
當(dāng)我們把a(bǔ)pp打包成apk安裝程序被盈,通過(guò)點(diǎn)擊apk文件進(jìn)行安裝時(shí)析孽,會(huì)啟動(dòng)安裝界面,
并在安裝成功后會(huì)跳轉(zhuǎn)安裝完成界面只怎,
如圖:

安裝完成界面

我們點(diǎn)擊圖中的打開(kāi)按鈕袜瞬,此時(shí)會(huì)啟動(dòng)我們的app

這里為了讓大家更容易理解一些,我們假設(shè)app有兩個(gè)界面

  • 啟動(dòng)界面SplashActivity
  • 主界面MainActivity
  • app啟動(dòng)后打開(kāi)SplashActivity身堡,3秒后自動(dòng)跳轉(zhuǎn)MainActivity,界面不做強(qiáng)制finish

接下來(lái)邓尤,我們需要了解下Task任務(wù)棧和Back Stack返回棧,
如果有同學(xué)對(duì)這兩個(gè)概念還不熟悉的贴谎,
可以看一下官方文檔汞扎,講得很詳細(xì):
Android任務(wù)和返回棧官方文檔

這里我們引用官方文檔的一句話:

The device Home screen is the starting place for most tasks. When the user touches an icon in the application launcher (or a shortcut on the Home screen), that application's task comes to the foreground. If no task exists for the application (the application has not been used recently), then a new task is created and the "main" activity for that application opens as the root activity in the stack.

當(dāng)我們點(diǎn)擊home界面的應(yīng)用啟動(dòng)圖標(biāo)時(shí)(安裝完成,界面點(diǎn)擊icon打開(kāi)同理)

如果沒(méi)有對(duì)應(yīng)Task任務(wù)棧存在,則會(huì)創(chuàng)建一個(gè)新的任務(wù)棧擅这,
并且把應(yīng)用啟動(dòng)的首頁(yè)面作為根Activity放到任務(wù)棧中澈魄。

如果存在對(duì)應(yīng)的Task任務(wù)棧,則會(huì)直接調(diào)用對(duì)應(yīng)的Task任務(wù)棧到前臺(tái)蕾哟,并將棧頂?shù)慕缑骘@示給用戶,

那么當(dāng)我們的app啟動(dòng)后打開(kāi)SplashActivity并跳轉(zhuǎn)主界面MainActivity后一忱,我們app的任務(wù)棧應(yīng)該如圖所示:


此時(shí)莲蜘,當(dāng)我們點(diǎn)擊Home鍵退回到桌面谭确,
app的Task任務(wù)棧進(jìn)入后臺(tái),然后我們點(diǎn)擊桌面上的啟動(dòng)圖標(biāo)票渠,正常情況下逐哈,app應(yīng)該會(huì)把它對(duì)應(yīng)的Task任務(wù)棧調(diào)到前臺(tái),并顯示剛剛棧頂?shù)腗ainActivity界面问顷,

正常流程

正常流程

然而昂秃,實(shí)際情況是,app會(huì)把它的Task任務(wù)棧調(diào)用到前臺(tái)杜窄,

并在任務(wù)棧上重新創(chuàng)建新的SplashActivity 肠骆,再跳轉(zhuǎn)到MainActivity,

在不重新加載application的情況下塞耕,它又重新走了一遍啟動(dòng)的流程蚀腿,這個(gè)時(shí)候,我們會(huì)發(fā)現(xiàn)任務(wù)棧中的Activity重復(fù)了扫外,SplashActivity跟MainActivity都變成了兩個(gè)

為了更清晰的讓大家理解莉钙,這里畫(huà)了兩個(gè)圖,

  • 錯(cuò)誤的bug流程
  • 錯(cuò)誤狀態(tài)下的Task任務(wù)棧

bug流程:


新調(diào)用的SplashActivity會(huì)被置于該app的task棧頂

多出了兩個(gè)Activity

當(dāng)然這個(gè)bug一般用戶也很難注意到筛谚,它的產(chǎn)生必須滿足下面的條件:

  • 點(diǎn)擊apk文件安裝app
  • 安裝完成界面點(diǎn)擊打開(kāi)按鈕
  • 點(diǎn)擊Home鍵磁玉,進(jìn)入系統(tǒng)桌面,此時(shí)app退到后臺(tái)
  • 再點(diǎn)擊桌面上啟動(dòng)圖標(biāo)

那么對(duì)于這種問(wèn)題我們?nèi)绾蝸?lái)處理呢?

按照上文的舉例驾讲,
在正常流程下啟動(dòng)app進(jìn)入MainActivity界面時(shí)的任務(wù)棧:


正常情況

bug情況下蚊伞,會(huì)調(diào)起任務(wù)棧到前臺(tái)并添加根Acitivy SplashActivity到棧頂席赂,此時(shí)的任務(wù)棧:


我們可以看到,在bug情況下啟動(dòng)app時(shí)时迫,SplashActivity(app的根Activity)再次創(chuàng)建并疊加到Task任務(wù)棧上了

理應(yīng)只會(huì)出現(xiàn)在棧底的SplashActivity出現(xiàn)在了其他位置氧枣,所以這里我們直接判斷了app根Activity SplashActivity的位置

在app的SplashActivity(app的根Activity)的onCreate方法中通過(guò) isTaskRoot() 方法來(lái)判斷是否是任務(wù)棧中的根Activity,如果是就不做任何處理别垮,如果不是則直接finish掉;

public class SplashActivity extends BaseActivity {
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setTheme(R.style.AppTheme_NoActionBar);
        super.onCreate(savedInstanceState);

        if (!isTaskRoot()) {
            finish();
            return;
        }
    }
}

這樣棧頂?shù)腟plashActivity在還未執(zhí)行其他代碼的情況下就finish()掉了便监,此時(shí)會(huì)顯示棧頂?shù)腗ainActivity。

參考文獻(xiàn)

Android爬坑之旅之不易發(fā)現(xiàn)的BUG

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碳想,一起剝皮案震驚了整個(gè)濱河市烧董,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胧奔,老刑警劉巖逊移,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異龙填,居然都是意外死亡胳泉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)岩遗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扇商,“玉大人,你說(shuō)我怎么就攤上這事宿礁“钙蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵梆靖,是天一觀的道長(zhǎng)控汉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)返吻,這世上最難降的妖魔是什么姑子? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮测僵,結(jié)果婚禮上街佑,老公的妹妹穿的比我還像新娘。我一直安慰自己恨课,他們只是感情好舆乔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剂公,像睡著了一般希俩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲辽,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天颜武,我揣著相機(jī)與錄音璃搜,去河邊找鬼。 笑死鳞上,一個(gè)胖子當(dāng)著我的面吹牛这吻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篙议,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唾糯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鬼贱?” 一聲冷哼從身側(cè)響起移怯,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎这难,沒(méi)想到半個(gè)月后舟误,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姻乓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嵌溢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹋岩。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赖草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星澳,到底是詐尸還是另有隱情疚顷,我是刑警寧澤旱易,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布禁偎,位于F島的核電站,受9級(jí)特大地震影響阀坏,放射性物質(zhì)發(fā)生泄漏如暖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一忌堂、第九天 我趴在偏房一處隱蔽的房頂上張望盒至。 院中可真熱鬧,春花似錦士修、人聲如沸枷遂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酒唉。三九已至,卻和暖如春沸移,著一層夾襖步出監(jiān)牢的瞬間痪伦,已是汗流浹背侄榴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留网沾,地道東北人癞蚕。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辉哥,于是被迫代替她去往敵國(guó)和親桦山。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評(píng)論 25 707
  • 用兩張圖告訴你醋旦,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料度苔? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • 在Android的app開(kāi)發(fā)過(guò)程中,除了機(jī)型適配等問(wèn)題浑度,常常還會(huì)出一些特殊的bug寇窑,這些bug往往需要特殊的場(chǎng)景情...
    香辣牛肉面閱讀 4,174評(píng)論 12 46
  • Application 標(biāo)簽 android:allowTaskReparenting android:allow...
    Shawn_Dut閱讀 7,807評(píng)論 2 61
  • 總是告誡自己,別惹是生非箩张,守好自已的一方凈土甩骏。可是非是雙方面造成的先慷,靠一個(gè)人躲是沒(méi)用的饮笛。別人要來(lái)招惹你,你躲也躲不...
    A寒秋閱讀 252評(píng)論 27 13