目錄
2.2 MainActivity中啓動SecondActivity
2.3 SecondActivity中啓動SecondActivity
2.4 SecondActivity中啓動MainActivity
2.5 MainActivity中啓動SecondActivity
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啓動到該任務中。