目錄
2. 場景1:MainActivity->SecondActivity->SecondActivity
2.2 MainActivity中啓動SecondActivity
2.3 SecondActivity中啓動SecondActivity
3.場景2:MainActivity->SecondActivity->MainActivity->SecondActivity
3.2 MainActivity中啓動SecondActivity
3.3 SecondActivity中啓動MainActivity
3.4 MainActivity中啓動SecondActivity
1. 概述
官方文檔對“singleTop”啓動模式的說明:
“如果目標任務在其堆棧頂部已有一個 Activity 實例,那麼該實例將接收新 Intent(通過調用 onNewIntent()
);此時不會創建新實例。在其他情況下 — 例如,如果“singleTop
”的一個現有實例雖在目標任務內,但未處於堆棧頂部,或者雖然位於堆棧頂部,但不在目標任務中 — 則系統會創建一個新實例並將其推送到堆棧上。”
接着就用Demo來驗證一下。
Demo中的launchMode:
MainActivity-Standard
SecondActivity-SingleTop
2. 場景1:MainActivity->SecondActivity->SecondActivity
2.1 啓動MainActivity
2.1.1 生命週期
2019-02-25 09:00:21.765 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 09:00:21.897 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 09:00:21.900 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2.1.2 Activity棧
TaskRecord{4c3267a #37 A=com.maureen.testtwoactivity U=0 StackId=6 sz=1}
Run #0: ActivityRecord{bb2ee2f u0 com.maureen.testtwoactivity/.MainActivity t37}
2.2 MainActivity中啓動SecondActivity
2.2.1 生命週期
2019-02-25 09:00:59.625 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 09:00:59.690 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 09:00:59.821 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 09:00:59.825 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 09:01:00.570 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 09:01:00.573 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2.2.2 Activity棧
TaskRecord{4c3267a #37 A=com.maureen.testtwoactivity U=0 StackId=6 sz=2}
Run #1: ActivityRecord{ed1f421 u0 com.maureen.testtwoactivity/.SecondActivity t37}
Run #0: ActivityRecord{bb2ee2f u0 com.maureen.testtwoactivity/.MainActivity t37}
2.3 SecondActivity中啓動SecondActivity
2.3.1 生命週期
2019-02-25 09:01:33.386 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 09:01:33.387 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onNewIntent:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 09:01:33.390 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2.3.2 Activity棧
TaskRecord{4c3267a #37 A=com.maureen.testtwoactivity U=0 StackId=6 sz=2}
Run #1: ActivityRecord{ed1f421 u0 com.maureen.testtwoactivity/.SecondActivity t37}
Run #0: ActivityRecord{bb2ee2f u0 com.maureen.testtwoactivity/.MainActivity t37}
3.場景2:MainActivity->SecondActivity->MainActivity->SecondActivity
3.1 啓動MainActivity
3.1.1 生命週期
2019-02-25 09:05:37.417 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@a20eef8
2019-02-25 09:05:37.599 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@a20eef8
2019-02-25 09:05:37.603 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@a20eef8
3.1.2 Activity棧
TaskRecord{90f809a #38 A=com.maureen.testtwoactivity U=0 StackId=7 sz=1}
Run #0: ActivityRecord{ebfb748 u0 com.maureen.testtwoactivity/.MainActivity t38}
3.2 MainActivity中啓動SecondActivity
3.2.1 生命週期
2019-02-25 09:06:32.960 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@a20eef8
2019-02-25 09:06:33.055 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
2019-02-25 09:06:33.182 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
2019-02-25 09:06:33.185 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
2019-02-25 09:06:33.914 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@a20eef8
2019-02-25 09:06:33.916 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@a20eef
3.2.2 Activity棧
TaskRecord{90f809a #38 A=com.maureen.testtwoactivity U=0 StackId=7 sz=2}
Run #1: ActivityRecord{c9d2cc1 u0 com.maureen.testtwoactivity/.SecondActivity t38}
Run #0: ActivityRecord{ebfb748 u0 com.maureen.testtwoactivity/.MainActivity t38}
3.3 SecondActivity中啓動MainActivity
3.3.1 生命週期
2019-02-25 09:07:16.659 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
2019-02-25 09:07:16.750 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@84a0e18
2019-02-25 09:07:16.861 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@84a0e18
2019-02-25 09:07:16.864 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@84a0e18
2019-02-25 09:07:17.591 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStop:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
2019-02-25 09:07:17.593 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.SecondActivity@a7068ff
3.3.2 Activity棧
TaskRecord{90f809a #38 A=com.maureen.testtwoactivity U=0 StackId=7 sz=3}
Run #2: ActivityRecord{1219cd8 u0 com.maureen.testtwoactivity/.MainActivity t38}
Run #1: ActivityRecord{c9d2cc1 u0 com.maureen.testtwoactivity/.SecondActivity t38}
Run #0: ActivityRecord{ebfb748 u0 com.maureen.testtwoactivity/.MainActivity t38}
3.4 MainActivity中啓動SecondActivity
3.4.1 生命週期
2019-02-25 09:08:13.364 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@84a0e18
2019-02-25 09:08:13.416 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@e5b1142
2019-02-25 09:08:13.519 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@e5b1142
2019-02-25 09:08:13.522 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@e5b1142
2019-02-25 09:08:14.244 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@84a0e18
2019-02-25 09:08:14.246 3508-3508/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@84a0e18
3.4.2 Activity棧
TaskRecord{90f809a #38 A=com.maureen.testtwoactivity U=0 StackId=7 sz=4}
Run #3: ActivityRecord{14d1dab u0 com.maureen.testtwoactivity/.SecondActivity t38} //在棧頂,棧中包含兩個SecondActivity實例
Run #2: ActivityRecord{1219cd8 u0 com.maureen.testtwoactivity/.MainActivity t38}
Run #1: ActivityRecord{c9d2cc1 u0 com.maureen.testtwoactivity/.SecondActivity t38}
Run #0: ActivityRecord{ebfb748 u0 com.maureen.testtwoactivity/.MainActivity t38}
4.總結
就如同官方文檔說明的,以“singleTop”模式啓動的Activity:
- 如果目標任務中已經存在該Activity實例,且該實例位於棧頂,則調用該實例的onNewIntent(),而不是創建新的實例(見場景1);
- 如果目標任務中已經存在該Activity實例,但是該實例不是位於棧頂,則創建新的實例(見場景2);
- 如果已經有該Activity實例位於棧頂,但是該任務不是目標任務,也要創建一個實例且將其推至目標任務的棧頂(暫未找到合適的例子)