【问题标题】:Android: Task affinity & Clear taskAndroid:任务关联和清除任务
【发布时间】:2014-02-27 00:09:59
【问题描述】:

我拥有三个模块 - ModuleA、ModuleB、ModuleC

ModuleA - 1 activity

MainActivity - 没有任务关联

Module B - 3 activities 

活动_A 任务亲和性 = "com.performance.poc.main"

活动_B 任务亲和性 = "com.performance.poc.main"

活动_C 任务亲和性 = "com.performance.poc.main"

Module C - 1 activity 

Activity_D - 没有任务关联

Navigation Case 1:
  1. 主要活动
  2. 在 btn 单击 - 启动 Activity_A Intent.FLAG_ACTIVITY_NEW_TASK
  3. 在 btn 单击 - 启动 Activity_B
  4. 在 btn 单击 - 启动 Activity_C
  5. 在 btn 单击 - 启动 Activity_D Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK

    预期的任务结果:
    任务 com.performance.poc

    活动_D
    主活动

    任务 com.performance.poc.main
    活动_C
    活动_B
    活动_A

    预期:在启动 Activity_D 任务时 com.performance.poc.main 应该被清除。 实际:Activity_A、Activity_B、Activity_C 仍然存在,但 MainActivity 已清除。


Navigation Case 2:
  1. 主要活动
  2. 在 btn 单击 - 启动 Activity_A Intent.FLAG_ACTIVITY_NEW_TASK
  3. 在 btn 单击 - 启动 Activity_B
  4. 在 btn 单击 - 启动 Activity_C Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK
  5. 在 btn 单击 - 启动 Activity_D Intent.FLAG_ACTIVITY_NEW_TASK

预期的任务结果:

任务 com.performance.poc
活动_D
主活动

任务 com.performance.poc.main

Activity_C
活动_B
活动_A

 Expected : on starting the Activity_C, in task com.performance.poc.main, Activity_A, Activity_B should be cleared. 
Actual :  Activity_A, Activity_B is cleared as expected.

我的问题是为什么在案例 1 中,即使 Activity_A、Activity_B、Activity_C 处于同一任务中,并且它没有清除这些并清除 MainActivity。

Clear_Task 应该清除 Activity 的现有任务使用意图 new_task 和 clear_task 调用 startActivity。 否则它将清除目标 Activity 的任务。

If it is Target activity, I need to clear the task of the leaving activity, is there any way to do it?

【问题讨论】:

  • 清单中的包名是什么?
  • package="com.performance.poc"
  • 当你说“没有任务关联”(例如在MainActivity)时,你的意思是<activity>标签中没有android:taskAffinity,对吗?
  • 是的。你说的对。也没有为该活动和应用程序标签添加 taskAffinity 属性。

标签: android android-navigation android-intent


【解决方案1】:

设置Intent.FLAG_ACTIVITY_CLEAR_TASK 将清除目标任务

你说你需要清除当前任务。您可以通过使用中间Activity 来做到这一点。只需创建一个简单的Activity,在onCreate() 中执行以下操作:

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

这个简单的 Activity 应该具有与 ActivityA, B and C 相同的 taskAffinity

ActivityC 想要启动ActivityD 时,它应该像这样启动这个活动:

Intent = new Intent(this, SimpleActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

这将清除当前任务,然后SimpleActivity 将启动ActivityD 并完成,这将完成任务。

【讨论】:

  • 谢谢大卫。是否有任何意图标志,我可以通过它来实现它?因为我有一个自定义类(导航控制器),它控制基于应用程序中的 config.xml 的所有导航和清除活动。
  • 对不起,没有。如果您将Activity 启动到另一个任务中,则没有可以设置的Intent 标志将清除当前任务。为此,您将需要我描述的“代表”或“代理”活动。另请注意,Intent.FLAG_ACTIVITY_CLEAR_TASK 仅适用于 Android 3.0 及更高版本,因此您的应用将无法在 Android 2.2/2.3 上运行(仍占设备安装基数的 20% 以上)
  • 我将为 Intent.FLAG_ACTIVITY_CLEAR_TASK 使用支持库。
    Intent i = new Intent(this, Activity_C.class);组件名称 cn = i.getComponent();意图 mainIntent = IntentCompat.makeRestartActivityTask(cn); startActivity(mainIntent);
  • 嗯。不确定这会起作用。文档表明这将重新启动根活动(在您的情况下为MainActivity。由于您的应用程序有多个任务,因此可能无法执行您想要的操作。此外,我不确定FLAG_ACTIVITY_CLEAR_TASK 的行为是否完全/正确模拟在兼容性库中。确保测试所有这些。
  • 另外,我希望您理解,如果您的应用程序有多个任务,用户通常很难/令人困惑地转到主屏幕,然后使用最近任务列表返回您的应用程序。确保您也测试了这些条件。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2014-08-21
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多