目录
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启动到该任务中。