文章目錄
- Android 驗證啟動模式
- 查看任務棧
- launchMode
- standard
- singleTop
- singleTask
- singleInstance
- Intent標記
- FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_CLEAR_TASK 和 FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_CLEAR_TOP
- FLAG_ACTIVITY_SINGLE_TOP
Android 驗證啟動模式
查看任務棧
可以通過 adb shell dumpsys activity activities
命令查看 Activity 任務棧。
launchMode
standard
OneActivty -> TwoActivity -> ThreeActivity -> ThreeActivity
棧信息:
* Task{347a4b3 #124 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=4}
bounds=[0,0][1080,2400]* ActivityRecord{75681b9 u0 com.example.demo/.ThreeActivity t124}* ActivityRecord{156b287 u0 com.example.demo/.ThreeActivity t124}* ActivityRecord{2982324 u0 com.example.demo/.TwoActivity t124}* ActivityRecord{f21da70 u0 com.example.demo/.OneActivity t124}
singleTop
將 ThreeActivity 設置為 singleTop。
依次啟動:OneActivty -> TwoActivity -> ThreeActivity -> ThreeActivity
棧信息:
* Task{5241c10 #154 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=3}bounds=[0,0][1080,2400]* ActivityRecord{d70d694 u0 com.example.demo/.ThreeActivity t154}* ActivityRecord{9c92c1f u0 com.example.demo/.TwoActivity t154}* ActivityRecord{54d0309 u0 com.example.demo/.OneActivity t154}
singleTask
將 TwoActivity 設置為 singleTask。
依次啟動:OneActivty -> TwoActivity -> ThreeActivity -> TwoActivity
棧信息:
* Task{ec23885 #174 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{f6f60c7 u0 com.example.demo/.TwoActivity t174}* ActivityRecord{1c8c6da u0 com.example.demo/.OneActivity t174}
singleInstance
將 ThreeActivity 設置為 singleInstance。
依次啟動:OneActivty -> TwoActivity -> ThreeActivity -> ThreeActivity
棧信息:
* Task{628a158 #176 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=1}
bounds=[0,0][1080,2400]* ActivityRecord{285b2b1 u0 com.example.demo/.ThreeActivity t176}
* Task{ce196c3 #175 type=standard A=10289:com.example.demo U=0 visible=false mode=fullscreen translucent=true sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{2a72e67 u0 com.example.demo/.TwoActivity t175}* ActivityRecord{b04408e u0 com.example.demo/.OneActivity t175}
Intent標記
FLAG_ACTIVITY_NEW_TASK
啟動 ThreeeActivity 時添加該標記。
依次啟動:OneActivty -> TwoActivity -> ThreeActivity -> ThreeActivity
棧信息:
* Task{93cafdd #142 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=4}
bounds=[0,0][1080,2400]* ActivityRecord{9233d38 u0 com.example.demo/.ThreeActivity t142}* ActivityRecord{7a45878 u0 com.example.demo/.ThreeActivity t142}* ActivityRecord{b0bb4ce u0 com.example.demo/.TwoActivity t142}* ActivityRecord{3652a23 u0 com.example.demo/.OneActivity t142}
在Manifest.xml文件中,給ThreeActivity添加 taskAffinity="www.baidu.com"
屬性,并依次啟動:OneActivty -> TwoActivity -> ThreeActivity -> ThreeActivity
棧信息:
* Task{919184b #144 type=standard A=10289:www.baidu.com U=0 visible=true mode=fullscreen translucent=false sz=1}
bounds=[0,0][1080,2400]* ActivityRecord{a186228 u0 com.example.demo/.ThreeActivity t144}
* Task{6b64d39 #143 type=standard A=10289:com.example.demo U=0 visible=false mode=fullscreen translucent=true sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{b15b5da u0 com.example.demo/.TwoActivity t143}* ActivityRecord{a3c6f7e u0 com.example.demo/.OneActivity t143}
總結:
如果沒有設置 taskAffinity 屬性,表現形式和standard模式一樣;如果設置了 taskAffinity 屬性,會在一個新的任務棧中啟動一個Activity。
FLAG_ACTIVITY_CLEAR_TASK 和 FLAG_ACTIVITY_NEW_TASK
依次啟動:OneActivty -> TwoActivity -> ThreeActivity
棧信息:
* Task{ff9bb3d #173 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=3}
bounds=[0,0][1080,2400]* ActivityRecord{52b8327 u0 com.example.demo/.ThreeActivity t173}* ActivityRecord{7866df1 u0 com.example.demo/.TwoActivity t173}* ActivityRecord{28f7f32 u0 com.example.demo/.OneActivity t173}
再啟動 -> ThreeActivity(添加該屬性)
棧信息:
* Task{ff9bb3d #173 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=1}
bounds=[0,0][1080,2400]* ActivityRecord{4903a43 u0 com.example.demo/.ThreeActivity t173}
總結:
會清空任務棧中的Acitivity實例,并啟動新的Activity實例。
FLAG_ACTIVITY_CLEAR_TOP
場景一:TwoActivity設置為standard
依次啟動:OneActivty -> TwoActivity -> ThreeActivity
棧信息:
* Task{42187d #165 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=3}
bounds=[0,0][1080,2400]* ActivityRecord{b4ffb82 u0 com.example.demo/.ThreeActivity t165}* ActivityRecord{20a3e02 u0 com.example.demo/.TwoActivity t165}* ActivityRecord{4c44440 u0 com.example.demo/.OneActivity t165}
再啟動-> TwoActivity(設置該屬性)
棧信息:
* Task{42187d #165 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{22e57ea u0 com.example.demo/.TwoActivity t165}* ActivityRecord{4c44440 u0 com.example.demo/.OneActivity t165}
場景二:TwoActivity設置為singleTop
依次啟動:OneActivty -> TwoActivity -> ThreeActivity
棧信息:
* Task{3cb644c #166 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=3}
bounds=[0,0][1080,2400]* ActivityRecord{4fce6bb u0 com.example.demo/.ThreeActivity t166}* ActivityRecord{c88c13d u0 com.example.demo/.TwoActivity t166}* ActivityRecord{4f10c95 u0 com.example.demo/.OneActivity t166}
再啟動-> TwoActivity(設置該屬性)
棧信息:
* Task{3cb644c #166 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{c88c13d u0 com.example.demo/.TwoActivity t166}* ActivityRecord{4f10c95 u0 com.example.demo/.OneActivity t166}
總結:
如果Activity的啟動模式設置為standard,該Activity會被重新創建,并且上方的Activity都會被清除;如果啟動模式設置為singleTop,則該Activity不會被重建,上方的Activity會被清除。
FLAG_ACTIVITY_SINGLE_TOP
啟動 TwoActivity 時添加該標記。
依次啟動:OneActivty -> TwoActivity -> TwoActivity
棧信息:
* Task{5566fe4 #172 type=standard A=10289:com.example.demo U=0 visible=true mode=fullscreen translucent=false sz=2}
bounds=[0,0][1080,2400]* ActivityRecord{cddc22b u0 com.example.demo/.TwoActivity t172}* ActivityRecord{a3d4c4d u0 com.example.demo/.OneActivity t172}
總結:
和 singleTop 的效果一樣。