singleTask模式&任务回栈

时间:2016-10-24 21:26:39

标签: android back-stack launchmode

可以请某人给我一个例子,告诉我如何在堆栈顶部创建一个具有launchMode = singleTask的Activity,并且它不是后端堆栈中唯一的活动,从而创建一个任务堆栈。

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

enter image description here

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

提前致谢

2 个答案:

答案 0 :(得分: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
    • AnotherActivity
      • 让它成为发射器
  7. AnotherActivity中实施一项操作:
    • 开始Activity1。你可以这样做:
  8.         Intent intent = new Intent();
            // package, fully qualified class name
            intent.setComponent(new ComponentName(
                "com.stackoverflow", "com.stackoverflow.Activity1");
            startActivity(intent);
    
    1. 启动Application1,即Activity1
    2. Activity1中,启动Activity2完成自己
    3. Activity2中,启动ActivityX完成自己
    4. ActivityX中,启动ActivityY
    5. 按主页
    6. 启动Application2,即AnotherActivity
    7. AnotherActivity中,启动Activity1
    8. Activity1中,启动Activity2 ,不自行完成
    9. Activity2中,启动ActivityY ,不自行完成
    10. 你去吧。现在用后退按钮弹出堆栈。

答案 1 :(得分: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); ,也会发生这种情况,如下所示:

X

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

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

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

如果您确实希望确保launchMode="singleTask"永远是其任务的根,无论它是如何启动的,您都需要使用launchMode="singleInstance"taskAffinity="" < strong>和指定Activity表示genres没有任务关联(即:它不属于任何其他活动)。