看来看去,关于启动模式和任务栈的还是觉得这位博主写的好,有例子便于理解。记录下来,以后方便查阅和添加笔记。

 

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()。

官方文档:https://developer.android.google.cn/training/implementing-navigation/ancestral?utm_source=udacity&utm_medium=course&utm_campaign=android_basics

 

========================Talk is cheap, show me the code======================