Activity的啓動模式:SingleTop

目錄

1. 概述

2. 場景1:MainActivity->SecondActivity->SecondActivity

2.1 啓動MainActivity

2.1.1 生命週期

2.1.2 Activity棧

2.2 MainActivity中啓動SecondActivity

2.2.1 生命週期

2.2.2 Activity棧

2.3 SecondActivity中啓動SecondActivity

2.3.1 生命週期

2.3.2 Activity棧

3.場景2:MainActivity->SecondActivity->MainActivity->SecondActivity

3.1 啓動MainActivity

3.1.1 生命週期

3.1.2 Activity棧

3.2 MainActivity中啓動SecondActivity

3.2.1 生命週期

3.2.2 Activity棧

3.3 SecondActivity中啓動MainActivity

3.3.1 生命週期

3.3.2 Activity棧

3.4 MainActivity中啓動SecondActivity

3.4.1 生命週期

3.4.2 Activity棧

4.總結


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實例位於棧頂,但是該任務不是目標任務,也要創建一個實例且將其推至目標任務的棧頂(暫未找到合適的例子)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章