Activity的啓動模式:SingleInstance

目錄

1、概述

2、詳細過程

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棧

2.4 SecondActivity中啓動MainActivity

2.4.1 生命週期

2.4.2 Activity棧

2.5 MainActivity中啓動SecondActivity

2.5.1 生命週期

2.5.2 Activity棧

3. 總結


1、概述

android官方文檔中說明的“singleInstance”是單獨存在於一個任務中,是任務的根Activity,且任務中有且僅有該Activity實例。

現在寫個Demo來驗證一下,Demo中launchMode:

MainActivity->Standard
SecondActivity->SingleInstance

2、詳細過程

2.1 啓動MainActivity

2.1.1 生命週期

2019-02-25 23:13:28.620 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 23:13:28.735 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 23:13:28.739 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@f6993c1

2.1.2 Activity棧

TaskRecord{47f543 #41 A=com.maureen.testtwoactivity U=0 StackId=9 sz=1}
        Run #0: ActivityRecord{89bb7c7 u0 com.maureen.testtwoactivity/.MainActivity t41}

2.2 MainActivity中啓動SecondActivity

2.2.1 生命週期

2019-02-25 23:14:26.865 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 23:14:27.010 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onCreate:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:14:27.165 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:14:27.172 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:14:27.493 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@f6993c1
2019-02-25 23:14:27.497 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@f6993c1

2.2.2 Activity棧

TaskRecord{32ddc7f #42 A=com.maureen.testtwoactivity U=0 StackId=10 sz=1} //SecondActivity單獨在一個任務中
        Run #0: ActivityRecord{b0a6fb5 u0 com.maureen.testtwoactivity/.SecondActivity t42}
TaskRecord{47f543 #41 A=com.maureen.testtwoactivity U=0 StackId=9 sz=1}
        Run #0: ActivityRecord{89bb7c7 u0 com.maureen.testtwoactivity/.MainActivity t41}

2.3 SecondActivity中啓動SecondActivity

2.3.1 生命週期

2019-02-25 23:15:34.987 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:15:34.988 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onNewIntent:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:15:34.991 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9

2.3.2 Activity棧

因爲已經存在了一個在單獨的Task中且是task中唯一的實例的情況,所以只是調用現有實例的onNewIntent。

TaskRecord{32ddc7f #42 A=com.maureen.testtwoactivity U=0 StackId=10 sz=1}
        Run #0: ActivityRecord{b0a6fb5 u0 com.maureen.testtwoactivity/.SecondActivity t42}
TaskRecord{47f543 #41 A=com.maureen.testtwoactivity U=0 StackId=9 sz=1}
        Run #0: ActivityRecord{89bb7c7 u0 com.maureen.testtwoactivity/.MainActivity t41}

2.4 SecondActivity中啓動MainActivity

2.4.1 生命週期

2019-02-25 23:16:47.014 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onPause:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:16:47.156 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onCreate:this=com.maureen.testtwoactivity.MainActivity@ee33d37
2019-02-25 23:16:47.267 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStart:this=com.maureen.testtwoactivity.MainActivity@ee33d37
2019-02-25 23:16:47.270 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onResume:this=com.maureen.testtwoactivity.MainActivity@ee33d37
2019-02-25 23:16:47.592 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStop:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:16:47.594 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9

2.4.2 Activity棧

TaskRecord{47f543 #41 A=com.maureen.testtwoactivity U=0 StackId=9 sz=2} //task #41 被移動到前臺,創建了兩個MainActivity實例
        Run #1: ActivityRecord{67ad938 u0 com.maureen.testtwoactivity/.MainActivity t41}
        Run #0: ActivityRecord{89bb7c7 u0 com.maureen.testtwoactivity/.MainActivity t41}
TaskRecord{32ddc7f #42 A=com.maureen.testtwoactivity U=0 StackId=10 sz=1}
        Run #0: ActivityRecord{b0a6fb5 u0 com.maureen.testtwoactivity/.SecondActivity t42}

2.5 MainActivity中啓動SecondActivity

2.5.1 生命週期

2019-02-25 23:18:31.981 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onPause:this=com.maureen.testtwoactivity.MainActivity@ee33d37
2019-02-25 23:18:32.016 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onNewIntent:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:18:32.020 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onStart:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:18:32.025 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]SecondActivity: onResume:this=com.maureen.testtwoactivity.SecondActivity@6c8c7b9
2019-02-25 23:18:32.741 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onStop:this=com.maureen.testtwoactivity.MainActivity@ee33d37
2019-02-25 23:18:32.744 4026-4026/com.maureen.testtwoactivity D/[APP_Maureen]MainActivity: onSaveInstanceState:this=com.maureen.testtwoactivity.MainActivity@ee33d37

2.5.2 Activity棧

TaskRecord{32ddc7f #42 A=com.maureen.testtwoactivity U=0 StackId=10 sz=1} //task #42被移動到前臺
        Run #0: ActivityRecord{b0a6fb5 u0 com.maureen.testtwoactivity/.SecondActivity t42}
TaskRecord{47f543 #41 A=com.maureen.testtwoactivity U=0 StackId=9 sz=2}
        Run #1: ActivityRecord{67ad938 u0 com.maureen.testtwoactivity/.MainActivity t41}
        Run #0: ActivityRecord{89bb7c7 u0 com.maureen.testtwoactivity/.MainActivity t41}

3. 總結

正如官方文檔描述的,以“singleInstance”模式啓動的Activity,如果現有實例在一個任務中,且是任務中的唯一實例,那麼就調用該實例的onNewIntent,而不是創建新的實例;反之,如果不存在該實例,則要新建一個任務,並創建該Activity的實例,將其放置於該任務的棧底,不允許其他Activity啓動到該任務中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章