重新理解Activity啟動模式,確認返回按鈕到哪個介面
前言:之前開發單個應用,把每個Activity宣告為singleTask完事,最近開發車機系統相關的應用,各個應用間通過語音可來回跳轉,點選返回時返回的Activity和預期不一致,於是研究了一下如何定位到當前Activity點返回會跳轉到哪
車機系統 Android4.4
所需概念
task&stack
Android對於Activity的管理使用First in,Last out的資料結構,對所有的Activity都通過回退棧的方式來管理
啟動activity實際上啟動的activity所屬的task,最頂部的activity處於onResume狀態,這點一定要切記
放入stack裡面的順序不能重排序,只能遵從後入先出的原則(pop&push)
Home在一個Stack裡面,其它應用在另一個Stack裡面,通過Task ID管理
使用命令
adb shell dumpsys activity > E:\stack01.txt
此時開啟生成的檔案找到 Recent tasks:

stack.png
即表示當前所有系統管理activity棧,Recent #0是當前介面,點選返回即跳到Recent #1,一直返回到tasks結束或Home為止
"sz=1"表示當前task所擁有的Activity數量,在同一個task的Activity回退完後,才會到另一個task,一般來說一個應用擁有一個獨立的task,(Home啟動應用會通過Intent設定FLAG_ACTIVITY_NEW_TASK的flag)
啟動模式與任務棧的關係
1.預設
預設情況下每次都啟動一個新的Activity例項
2.singleTop
當前Activity在task頂部時,及當前正在互動的Activity需要重新開啟時不會建立例項,而會走到onNewIntent裡面
非頂部和預設情況下一致
3.singleTask
當前task裡面有例項則會複用,回撥onNewIntent,並將當前Activity上面的Activity彈出銷燬
4.singleInstance
同singleTask類似,不同的是這個task裡面只會有唯一一個Activity,啟動其它Activity會放到新的一個task裡面(可理解為給其它Activity設定FLAG_ACTIVITY_NEW_TASK)
標識)
有一點需要注意,對於從Home啟動的Activity來說,會設定mOnTopOfHome=true,不管和Home是不是同一個Stack都會返回到主頁
小技巧
沒有給定API介面啟動其他應用(跳到指定activity)儘量使用
Intent intent = MyApp.getInstance().getPackageManager() .getLaunchIntentForPackage("com.example.otherpackage"); MyApp.getInstance().startActivity(intent);
由系統判斷Launcher category啟動,如果手動啟動需要根據當前方案設定intent的flag