Android Bug分析系列:第三方平臺安裝app啟動后夭拌,home鍵回到桌面后點擊app啟動時會再次啟動入口類bug的原因剖析

最近公司測試測出來這么一個問題

具體表現(xiàn)是:

1,用QQ將我們自己的apk包從電腦端傳送到手機端,點擊安裝鸽扁,安裝成功后點擊QQ瀏覽器的打開按鈕(這時候的邏輯應該是觸發(fā)閃屏頁蒜绽,然后finish掉閃屏頁,接著跳轉到主頁Activity(主頁Activity是SignleTask設計模式的))

2桶现,然后點擊Home鍵躲雅,回到桌面

3,再在桌面上點擊app的icon巩那,原諒耿直的我們都是覺得應該直接回到【主頁Activity】吏夯,但是結果卻是又一次觸發(fā)?【閃屏頁Activity】,亮瞎了24K鈦合金狗眼的我們覺得這玩法不對吧即横?

4噪生,但是在QQ安裝器安裝成功后,不點擊QQ瀏覽器頁面的打開按鈕东囚,而是回到桌面點擊app的icon跺嗽,接著執(zhí)行2和3步驟,是不會有問題的

4页藻,好吧桨嫁,只能自己分析原因解決問題了

現(xiàn)象分析

上面兩種操作方式的不同點在于也就是啟動App的入口不一樣。一者是平常的桌面Icon圖標啟動份帐,一者是QQ安裝這類第三方平臺啟動璃吧,我們都知道,桌面啟動的話也是通過startActivity這個api通過特定的Intent向ActivityManageService發(fā)起啟動任務废境,所以可以推測出的是QQ安裝啟動這類方式也是通過Intent啟動對應的App畜挨,所以,可以肯定的是噩凹,通過QQ安裝啟動這類方式和通過桌面點擊app的icon圖標方式并不完全一致

背景知識

1巴元,Activity的Task管理

我們都知道,當一個具有singleTask啟動模式的Activity請求啟動后驮宴,比如Activity A逮刨,系統(tǒng)首先會尋找是否存在A想要的任務棧,如果不存在堵泽,則就重新創(chuàng)建一個任務棧修己,然后創(chuàng)建A的實例把A放到任務棧中,如果存在A所需的任務棧迎罗,這時候要看A在棧中是否有實例存在箩退,如果有實例存在,那么系統(tǒng)就會把A調到棧頂并調用它的onNewIntent,如果實例不存在佳谦,就創(chuàng)建A的實例并把A壓入棧中戴涝,那什么是A想要的任務棧呢,這就涉及到Activity的TaskAffinity,可以翻譯為任務相關性,這個參數(shù)標示了一個Activity所需要的任務棧的名字啥刻,默認情況下奸鸯,所有Activity所需的任務棧的名字為應用的包名。當然可帽,我們可以為每個Activity都單獨制定TaskAffinity娄涩,這個屬性值必須不能和包名相同,否則就相當于沒有指定映跟,需要指出的是TaskAffinity主要和singleTask啟動模式配對使用蓄拣,在其他情況下并沒有意義。

一般來說努隙,Android系統(tǒng)中App的啟動與切換依賴于Activity的Task管理球恤,下面簡單分析一下不同應用之間切換時候相關Task的變化,根據(jù)上面的分析荸镊,一個應用中可能有多個Task咽斧,一個Task中也有可能有多個Activity,為了簡單起見躬存,下面假設A张惹、B、C三個應用都是單Task的

桌面程序App(A):【TaskA】 ---- 存在Activity有【A1】 ---- ?其棧的結構為 A1

應用程序B:【TaskB】 ---- 存在Activity有【B1】【B2】 ---- 其棧的結構為 B1B2

應用程序C: 【TaskC】?----?存在Activity有【C1】【C2】 ----?其棧的結構為 C1C2

依次進行下面的操作

a岭洲、那么我們進入桌面時:Task之間的結構是 A1 ---- 也就是只有一個【TaskA】棧(桌面Task)宛逗,并且位于最前端(這里表現(xiàn)為最后添加的末端)

b、然后我們點擊應用程序B的圖標盾剩,啟動B :Task之間的結構是 A1B1B2? ---- 添加了一個【TaskB】雷激,而且【TaskB】也是位于最前端,現(xiàn)在顯示的是【TaskB】的B2的Activity的界面

c彪腔、接著點擊home鍵: Android對于home做了特殊默認處理侥锦,就是會把桌面Task挪到所以Task最前端进栽,Task結構應該變成??B1B2A1 ---- 【TaskA】挪到隊列最前端德挣,現(xiàn)在顯示的是【TaskA】的A1的Activity的界面,也就是桌面

d快毛、我們再在桌面點擊應用程序C的圖標格嗅,啟動C : Task之間的結構變成?B1B2A1C1C2 ----?添加了一個【TaskC】,而且【TaskC】也是位于最前端唠帝,現(xiàn)在顯示的是【TaskC】的C2的Activity的界面

好了屯掖,說了這么多,下面接著分析bug

原理剖析

 從此我們可以知道QQ安裝器其實也就是使用Intent來啟動其剛剛安裝的那個App襟衰,但是問題所在的是:他們的啟動Intent并沒有跟桌面的啟動Intent完全一致贴铜!

而從柯元旦所著的《android內核剖析》一書中有記錄如下規(guī)則:

每次啟動Intent導致新創(chuàng)建Task的時候,該Task會記錄導致其創(chuàng)建的Intent;而如果后續(xù)需要有一個新的與創(chuàng)建Intent完全一致(完全一致定位為:啟動類绍坝,action徘意、category等等全部一樣,不可多項也不可缺少)轩褐,那么該Intent并不會觸發(fā)Activity的新建啟動椎咧,而只會將已經(jīng)存在的對應Task移到前臺;這也就是為什么桌面會在再次點擊圖標時將后臺任務挪到前臺而不是重新啟動App的實現(xiàn)把介。

我們將桌面的Task記為【TaskL】勤讽,QQ安裝器的Task記為【TaskQ】,我們應用的Task記為【TaskA】拗踢,那么分析如下:(L1是單純的桌面)

打開QQ:?L1Q1Q2 ---- Q2是安裝完畢后詢問是否啟動對應程序的Activity

點擊打開:?L1Q1Q2A2 ---- A1是入口閃屏頁脚牍,A2是主頁Activity,啟動后A1業(yè)務邏輯應該finish掉秒拔,所以從【TaskA】中挪去

返回桌面:?Q1Q2A2L1 ---- 回到桌面頁莫矗,也就是L1前置

點擊A的圖標:?Q1Q2L1A2A1 -> Q1Q2L1A2A1?---- 找到【TaskA】,挪到前臺砂缩,由于比對Intent并不是完全一致作谚,所以該請求是新啟動Activity,那么把A1添加到對應的【TaskA】中庵芭,然后A1所再一次觸發(fā)啟動主頁妹懒,但是主頁是singleTask模式,所以又回到了上次對應的A2主頁双吆,所以現(xiàn)象為再一次出現(xiàn)閃屏頁眨唬,然后回到原先的主頁界面。

解決思路

1好乐、讓騰訊那些第三方平臺修正其啟動Intent的設置匾竿,使其與原聲桌面啟動Intent保持完全一致。(PS:基本不可能)

2蔚万、自身業(yè)務代碼規(guī)避岭妖,我們可以知道,如果是多余的閃屏頁入口Activity的話反璃,其基本不可能位于Task的根部昵慌,而如果正常啟動的話,閃屏頁入口Activity必定在多對應的Task的根部位置淮蜈,那么我們可以從這個地方對于這個bug進行規(guī)避斋攀,方法就是在閃屏頁入口Activity的onCreate代碼加入如下一段代碼:

// 避免從桌面啟動程序后,會重新實例化入口類的activity

if(!this.isTaskRoot()) {

? ? Intent intent = getIntent();

? ? if(intent !=null) {

? ? ? ? String action = intent.getAction();

? ? ? ? if(intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {

? ? ? ? ? ? finish();

? ? ? ? ? ? return;

? ? ? ? }

? ? }

}

?問題解決梧田!

https://www.cnblogs.com/net168/p/5722752.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末淳蔼,一起剝皮案震驚了整個濱河市侧蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹉梨,老刑警劉巖闺魏,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俯画,居然都是意外死亡析桥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門艰垂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泡仗,“玉大人,你說我怎么就攤上這事猜憎∶湓酰” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵胰柑,是天一觀的道長截亦。 經(jīng)常有香客問我,道長柬讨,這世上最難降的妖魔是什么崩瓤? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮踩官,結果婚禮上却桶,老公的妹妹穿的比我還像新娘。我一直安慰自己蔗牡,他們只是感情好颖系,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辩越,像睡著了一般嘁扼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黔攒,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天趁啸,我揣著相機與錄音,去河邊找鬼亏钩。 笑死莲绰,一個胖子當著我的面吹牛欺旧,可吹牛的內容都是我干的姑丑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼辞友,長吁一口氣:“原來是場噩夢啊……” “哼栅哀!你這毒婦竟也來了震肮?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤留拾,失蹤者是張志新(化名)和其女友劉穎戳晌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴柔,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡沦偎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咳蔚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪嚎。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谈火,靈堂內的尸體忽然破棺而出侈询,到底是詐尸還是另有隱情,我是刑警寧澤糯耍,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布扔字,位于F島的核電站,受9級特大地震影響温技,放射性物質發(fā)生泄漏革为。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一舵鳞、第九天 我趴在偏房一處隱蔽的房頂上張望篷角。 院中可真熱鬧,春花似錦系任、人聲如沸恳蹲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘉蕾。三九已至,卻和暖如春霜旧,著一層夾襖步出監(jiān)牢的瞬間错忱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工挂据, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留以清,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓崎逃,卻偏偏與公主長得像掷倔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子个绍,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容