Android開發遇到的坑-----App首次安裝,退后台再返回前台時重新顯示Splash頁面


1. 問題描述

前段時間測試給我提了個bug, App首次安裝,按Home鍵退后台, 然后點擊桌面上的啟動按鈕(不是從后台程序中進入), 然后會再次顯示SplashActvitiy, 歡迎頁或引導頁

2. 解決過程

最初發現這個問題的時候, 並沒有定位到詳細的復現步驟, 后面反復測試, 才發現只有在除此安裝時出現, 

當時第一反應是出現了crash現象, 但是從log里面, 沒有報出任何crash的信息,  於是祭神器, 

https://stackoverflow.com/questions/19545889/app-restarts-rather-than-resumes

他的回答的連接(google issue 自行科學上網): https://issuetracker.google.com/issues/36907463

可以看到提出該問題的時間是2009年

 

然而這個故事一直延續到了2018年.......

 

3. 解決方案

借助於stackOverflow那位回答給出的代碼, 我測試過, 的確可行的, 主要是根據 isTaskRoot()方法判斷是否已經存在於ActivityTaskStack中, 如果已經存在, 那么就將自己結束掉

 if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
 }

 

4. 簡要分析

下圖紅色部分, 大概意思是說, 應用並不是重新啟動了, 只是將這個Activity重新加入到了 Activity Task stack的棧頂, 

如果不將啟動頁finish, 直接跳轉到另一個Activity, 在第二個Activity中點擊返回按鈕, 那么仍然能夠看到這個啟動頁

我按照他所說做了一下簡單測試, 並使用adb命令查看Activity task stack

adb shell dumpsys activity activities

下圖分別是重復問題復現步驟時, 使用那個解決方式的代碼前Activity Task stack的信息

如答者所說, 很明顯看到, MainActivity在任務棧中出現了兩次, 之前那次並沒有被銷毀, 只是重新將MainActivity加載到了棧頂

 

下面這幅圖是根據isTaskRoot的判斷並finish結束自己后的Activity Task stack信息,

能夠看到任務棧中, 由於第二次啟動時, 判斷MainActivity已經位於task root, 然后結束掉自己, 就沒有再次出現在棧頂, 所以就沒有出現bug效果

 

5. 總結

關於這個問題, 我覺得已經算是Android系統的問題了, 而且在國內, 並不是所有廠商都會出現上述問題, 例如google issue上有人說華為P8(Android 7.0)修復了這個問題, 由於我沒有找到該機型, 所以我並沒有驗證

並且, 這個問題的出現時機, 只會在首次安裝app時, 要按Home鍵退后台, 再次點擊桌面的啟動圖標(而不是從后台程序列表), 才會出現, 所以是否要利用上述答案的代碼對此問題做修復, 有待商榷, 

具體還是看對app的需求吧

我找了幾個身邊的朋友(非程序員) 問了一下他們對這個問題的看法(主要是否會因為這個問題而對這個app產生反感), 反正我身邊的人都覺得這個問題是個無所謂的事情, 也不是主要功能

 

總體來講, 只能說Android系統博大精深......, 還要繼續學習, 

 

如有錯誤, 歡迎指出, 感激不盡 ~~!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM