看来看去,关于启动模式和任务栈的还是觉得这位博主写的好,有例子便于理解。记录下来,以后方便查阅和添加笔记。
Activity启动模式与任务栈(Task)全面深入记录(上):https://blog.csdn.net/javazejian/article/details/52071885
Activity启动模式与任务栈(Task)全面深入记录(下):https://blog.csdn.net/javazejian/article/details/52072131
然后记住
taskAffinity属性是标识着Activity所需要的任务栈的名称,不要与当前应用包名相同,否则其值跟作废没两样。
allowTaskReparenting主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关。
具体原因见上面Activity启动模式与任务栈(Task)全面深入记录(下)
==================以下开始做笔记======================
下表可能有助于区分不同的启动方式:
启动模式 | Default | 实例化 | 是否启动新任务 | 是否允许在任务中启动其他activity |
---|---|---|---|---|
standard | 是 | 每次创建intent时,都会创建一个新实例。此外,实例可以是多个任务的成员,也可以是一个任务中的多个实例。 | 否。在发起意图的同一任务中打开 | 是 |
singleTop | 否 | 与标准完全相同,但如果活动位于Task堆栈的顶部,则使用现有实例。 | 否。在发起意图的同一任务中打开 | 是 |
singleTask | 否 | 单实例 |
是。只要设置其他任务栈就是根任务。 |
是 |
singleInstance | 否 | 单实例 | 是。总是根任务。 | 决不允许。始终是任务中唯一的活动 |
可以在Terminal通过 adb shell dumpsys activity activities
命令查看此时栈的情况,只看Running activities (most recent first)即可
情景一:
就是如果应用启动默认的A,A再启动singleTask的B,B的taskAffinity设置了另一个任务栈,此时B再启动默认的C,是这样的
也就是singleTask的B启动默认的C会和B在同一个任务栈
但是如果B是singleInstance呢?
B再启动默认的C就是在原来的任务栈,而不是和B在一个任务栈。
关于基本用例分析见这里https://blog.csdn.net/zjwfan/article/details/52047719
情景二:
是关于向上导航的,其中需要指定父活动。
要实现向上导航,第一步是声明哪个活动是每个活动的适当父级。这样做允许系统便于导航模式,例如Up,因为系统可以从清单文件中确定逻辑父活动。
从Android 4.1(API级别16)开始,您可以通过在<activity>元素中指定android:parentActivityName属性来声明每个活动的逻辑父级。
如果您的应用支持Android 4.0及更低版本,请在您的应用中添加支持库,并在<activity>中添加<meta-data>元素。然后将父活动指定为android.support.PARENT_ACTIVITY的值,与android:parentActivityName属性匹配。
如下:
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<!-- 为了向下兼容 -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>
要在用户按下应用程序图标时向上导航,可以使用NavUtils类的静态方法navigateUpFromSameTask()。当您调用此方法时,它将完成当前活动并启动(或恢复)相应的父活动。如果目标父活动位于任务的后台堆栈中,则会将其提前。它的提出方式取决于父活动是否能够处理onNewIntent()调用:
如果父活动的启动模式<singleTop>,或者向上的意图包含FLAG_ACTIVITY_CLEAR_TOP,则父活动将被带到堆栈顶部,并通过其onNewIntent()方法接收intent。
如果父活动具有启动模式<standard>,并且向上意图不包含FLAG_ACTIVITY_CLEAR_TOP,则从堆栈弹出父活动,并在堆栈顶部创建该活动的新实例以接收意图。也就是说父活动会onDestroy()后重新onCreate()。
========================Talk is cheap, show me the code======================