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

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