問題描述:
應用需求首次打開app,進入SplashActivity頁面,如果支持一鍵登錄功能,
直接跳轉到閃驗sdk(創藍閃驗集成三網運營商)一鍵登錄頁面,該sdk中頁面只支持代碼定制UI以及介面回傳控制,有點坑,當進入一鍵登錄頁面,切換到app的賬號密碼登錄頁面,使用賬號密碼登錄成功跳轉到app首頁之后,連續按2次回傳鍵,finish掉當前主頁,app回到桌面,這個時候如果從近期任務進入app,發現沒有進入splash頁面-判斷token有效-靜默成功登錄到主頁,而是直接進入了賬號密碼登錄頁面,匪夷所思,懷疑人生了,按照正常流程是回傳鍵finish掉了堆疊里面的全部activity,下次近期任務進入也是從SplashActivity開始,靜默登錄到主頁,,,
問題排查:
SplashActivity—android:launchMode=“standard”
PwdLoginActivity—android:launchMode=“singleTask”
閃驗sdk一鍵登錄 ShanYanOneKeyActivity— android:launchMode=“singleTask”
MainActivity—android:launchMode=“singleTask”
SplashActivity、PwdLoginActivity、MainActivity是自己的app中的代碼,沒有設定任何的taskAffinity,默認都是在同一個任務堆疊中運行的,排查了ShanYanOneKeyActivity也配置的一樣的taskAffinity,應該都是在一個task堆疊中,全部finish掉了,近期任務打開就應該的SplashActivity啊,這個是理論上的,實際還是需要驗證,有沒有更直觀的方法呢?百度
adb shell dumpsys activity activities|findstr “app行程的名字”,運行后結果如下,可以直觀的看到當前的activity屬于哪個任務堆疊的

分析發現,首次啟動應用
首次打開SplashActivity,查看當前的所屬任務堆疊ID為 t49000,支持一鍵登錄
自動跳轉到一鍵登錄頁ShanYanOneKeyActivity,所屬任務堆疊ID為 t49000(SplashActivity再執行 finish操作),
再次切換到 PwdLoginActivity賬號密碼登錄頁面,發現所屬任務堆疊ID為 t49001
之后輸入賬號密碼跳轉到主頁(PwdLoginActivity再finish),發現所屬任務堆疊ID為 t49001
連續2次回傳鍵,finish掉自己,退回到桌面了,再次近期任務進入,問題復現
進入PwdLoginActivity,發現所屬任務堆疊ID為 t49001
也就是說,首次從ShanYanOneKeyActivity跳轉到PwdLoginActivity切換了任務堆疊,導致
PwdLoginActivity、后面的登錄成功頁面都在 t49001 中運行,回傳鍵退出了t49001堆疊中所有的界面,再次從近期任務進入,會打開該任務堆疊的入口,也就是PwdLoginActivity界面,
問題來了,為啥ShanYanOneKeyActivity跳轉到PwdLoginActivity會創建新的任務堆疊,而不是t49000呢???
通過撰寫簡易demo最終發現問題,
t49000堆疊中只有ShanYanOneKeyActivity,跳轉到PwdLoginActivity,如果是先finish 自己 ShanYanOneKeyActivity,再跳轉到
PwdLoginActivity,就會創建一個新的任務堆疊,如果是先跳轉到PwdLoginActivity,再finish自己,就會共用一個任務堆疊ID為 t49000,至于具體原因,猜測是先finish自己,堆疊被回收了,這個時候打開PwdLoginActivity 不能復用t49000,所以創建新的,有待驗證,
排查代碼,發現再接入一鍵登錄時候,復制demo的代碼,默認true 先finish后跳轉,導致出現這個問題,

改正為自己控制,打開的密碼登錄頁,再關閉一鍵登錄頁面,會復用了上一個堆疊,問題解決,

總結
任務堆疊啟動模式看似簡單,內部原理很復雜,遇到問題再研究吧,,,
一些實用的命令
adb shell dumpsys activity activities|findstr com.example.myapplication
adb shell dumpsys activity activities|findstr mFocus
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335179.html
標籤:其他
