首页 文章

singleTask模式和任务后台堆栈

提问于
浏览
3

可以请有人给我一个例子,说明我们如何创建一个任务后台堆栈,在堆栈顶部有一个具有launchMode = singleTask的Activity,它不是后台堆栈中的唯一活动 .

例如,我们在下图中有一个这样的任务(包括活动X和Y);

enter image description here

据我所知,singleTask活动应该是根目录,任务元素永远不能重新排列 .

提前致谢

2 回答

  • 0
    • 创建一个包含四个活动的应用 Application1

    • Activity1

    • 确保它 is not exported="false" (也就是说,它是 true 显式或隐式)

    • 将其作为 Launcher

    • Activity2

    • ActivityX

    • ActivityY

    • 这是一个: launchMode="singleTask"

    • Activity1 实施两项行动,例如两个不同的按钮各执行以下操作:

    • 开始 Activity2 并完成自己

    • 开始 Activity2do not 完成自己

    • Activity2 实施两项行动:

    • 开始 ActivityX 并完成自己

    • 开始 ActivityYdo not 完成自己

    • ActivityX 实施一个动作:

    • 开始 ActivityYdo not 完成自己

    • ActivityY 什么都不做:)

    • 使用活动创建另一个应用 Application2

    • AnotherActivity

    • 将其作为 Launcher

    • AnotherActivity 实施一个动作:

    • 开始 Activity1 . 你可以这样做:

    Intent intent = new Intent();
            // package, fully qualified class name
            intent.setComponent(new ComponentName(
                "com.stackoverflow", "com.stackoverflow.Activity1");
            startActivity(intent);
    
    • 启动 Application1 ,将启动 Activity1

    • Activity1 中,启动 Activity2 完成自身

    • Activity2 中,启动 ActivityX 完成自身

    • ActivityX 中,启动 ActivityY

    • 按回家

    • 启动 Application2 ,将启动 AnotherActivity

    • AnotherActivity 中,启动 Activity1

    • Activity1 中,启动 Activity2 without 完成自身

    • Activity2 中,启动 ActivityY without 完成自身

    你去吧现在用后退按钮弹出堆栈 .

  • 0

    实际上,这很容易做到 .

    要生成在根目录中包含 X 且在顶部包含 Y 的任务,即使使用 launchMode="singleTask" 声明了 Y

    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name=".X">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".Y" android:launchMode="singleTask"/>
    </application>
    

    在活动 X 中,只需启动活动 Y ,如下所示:

    startActivity(new Intent(this, SingleTaskActivity.class));
    

    现在,您将拥有一个任务,其根目录为活动 X ,活动为 Y .

    即使您明确表示要在新任务中启动 Y ,也会发生这种情况,如下所示:

    Intent intent = new Intent(this, SingleTaskActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    

    这似乎违反直觉,但原因是因为 XY 具有相同的 taskAffinity . 当Android需要决定如何启动 Activity 时, taskAffinity 胜过 launchMode .

    taskAffinity ,如果没有特别设置,则默认为应用程序的包名称 . 具有相同 taskAffinity 的所有活动将启动到同一任务中 .

    这使大多数开发人员感到困惑,因为文档没有经常提及 taskAffinity .

    如果你真的想确定 Activity 永远是它的任务的根,无论它是如何启动的,你需要使用 launchMode="singleTask"launchMode="singleInstance" and 指定 taskAffinity="" 来表示 Activity 没有任务亲和力(即:它不属于任何其他活动) .

相关问题