3

请有人给我一个示例,说明我们如何通过在堆栈顶部具有launchMode = singleTask的Activity来创建任务回栈,并且它不是回栈中的唯一活动。

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

在此处输入图像描述

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

提前致谢

4

2 回答 2

0

实际上,这很容易做到。

要生成包含X在根和Y顶部的任务,即使Y声明为launchMode="singleTask"

<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具有相同的taskAffinitytaskAffinitylaunchModeAndroid 需要决定如何Activity启动.

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

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

如果您真的想确保 anActivity始终是其任务的根,无论它如何启动,您都需要使用launchMode="singleTask"orlaunchMode="singleInstance" 指定taskAffinity=""指示 theActivity没有任务关联(即:它不属于任何其他活动)。

于 2016-12-28T14:46:13.627 回答
0
  1. 创建一个Application1包含四个活动的应用程序:
    • Activity1
      • 确保它不是 exported="false"(也就是说,它true是显式的或隐式的)
      • 让它成为启动器
    • Activity2
    • ActivityX
    • ActivityY
      • 这是一个:launchMode="singleTask"
  2. Activity1实现两个动作时,例如两个不同的按钮,每个按钮执行以下操作:
    • 开始Activity2和结束自己
    • 开始Activity2结束自己
  3. Activity2实施两个动作:
    • 开始ActivityX和结束自己
    • 开始ActivityY结束自己
  4. ActivityX实施一项行动:
    • 开始ActivityY结束自己
  5. ActivityY没做什么 :)
  6. Application2使用 Activity 创建另一个应用程序:
    • AnotherActivity
      • 让它成为启动器
  7. AnotherActivity实施一项行动:
    • 开始Activity1。你可以这样做:
        Intent intent = new Intent();
        // package, fully qualified class name
        intent.setComponent(new ComponentName(
            "com.stackoverflow", "com.stackoverflow.Activity1");
        startActivity(intent);
  1. Launch Application1,这将启动Activity1
  2. Activity1, 开始Activity2完成自己
  3. Activity2, 开始ActivityX完成自己
  4. ActivityX,开始ActivityY
  5. 新闻主页
  6. Launch Application2,这将启动AnotherActivity
  7. AnotherActivity,开始Activity1
  8. Activity1, 开始Activity2 而不结束本身
  9. Activity2, 开始ActivityY 而不结束本身

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

于 2016-10-25T22:01:19.333 回答