【问题标题】:Android: Multiple activity instances launched by same intent. Bring one uniquely to foreground?Android:由同一意图启动的多个活动实例。把一个独特的带到前台?
【发布时间】:2011-05-09 23:50:19
【问题描述】:

我正在为我的应用程序启动多个实例而苦苦挣扎 使用相同意图的相同活动。我的主要活动是课堂类型 A 并且它对两个相同的孩子执行 startActivity() B类。所以我们推出了B1和B2。如果 B1 和 B2 都是 暂停(通过按下返回按钮并确保未调用 finish() 在他们身上,所以他们真的暂停了),A怎么能独特地带来B1 还是 B2 再次出现在前台?我确实想发起一个新的 B 活动。一世 想要唯一地将 B1 或 B2 带到前台。

所以 B1 和 B2 都是这样创建的... Intent 意图 = new Intent(context, B.class); 意图.addFlags(意图.FLAG_ACTIVITY_NEW_TASK); 开始活动(意图);

现在我想让 A 将 B1(或 B2)带到前台/前面,所以我使用 下面的代码,但是在启动时如何区分 B1 或 B2 活动?这只会将 B 的最后一个实例带到顶部 前景。

Intent 意图 = new Intent(context, B.class); 意图.addFlags(意图.FLAG_ACTIVITY_REORDER_TO_FRONT); 开始活动(意图);

我尝试保留对 B1 和 B2 的引用并做一些事情 像这样,但这也只适用于活动的最后一个实例 B班上位...

Intent 意图 = new Intent(B1context, B.class); 意图.addFlags(意图.FLAG_ACTIVITY_REORDER_TO_FRONT); B1context.startActivity(intent);

我什至试过这个,但它仍然没有得到我独特的 B1 或 B2... 意图意图 = B1.getIntent(); // 即最初的意图 开始了我 开始活动(意图); // 仍然只将最后一个 B 带到前面 位居榜首。

提前致谢!

【问题讨论】:

  • 如何制作一个扩展 B 的 C,这样 B 可以是 B1,C 可以是 B2?这确实不能回答你的问题,但是如果没有人可以回答这个问题,你可以使用它
  • 也许您可以通过<activity-alias> 实现它。您需要 B1 和 B2 是单独的组件,通常是单独的活动类。

标签: android android-activity android-intent


【解决方案1】:

谢谢。这两个都是很好的建议。我曾考虑制作一个扩展 B 的 C。在我的应用程序中,我想做非常通用的事情,因为我有 n 个 B 实例。它不是一个固定的数字。我正在考虑在 AndroidManifest.xml 中创建 10-20 个这些简单的子类,然后在它们被销毁时对其进行管理,以便我可以重用它们。

我不知道,但看起来类似于子类的想法。很高兴有另一种选择。

在我看来很奇怪,在 Android 中如何处理历史堆栈比诉诸技巧更容易处理这一点并不明显。除了在堆栈中唯一标识一个 Activity 之外,一切都在那里。

【讨论】:

  • 拥有 N 个活动实例不是一个好方法,无论您想用它完成什么,肯定都可以通过其他方式完成。
  • 嗯,我希望我的应用程序也是如此。我有这些 B 级活动的主要清单。虽然来自同一个基类,但每个活动都使用自己独特的数据集执行自己独特的操作集。我需要能够在活动执行其操作时在它们之间切换用户上下文。
【解决方案2】:

基本上你不能。 NEW_TASK 的目的是在用户看到它们时启动单独的“应用程序”。如果您使用它来试图操纵通过您的应用程序的流程,那么您就是在滥用它(并破坏最近的任务等)。

您可以通过子类使它们成为实际独立的类来解决此问题,但在此之前请停下来考虑一下您在这里所做的事情是否真的正确。只有少数几个地方应该使用 NEW_TASK —— 启动器、通知切换等。在所有这些情况下,用户正在启动的目标都有一个非常独特的标识。无论你做什么都应该保持这些语义。

【讨论】:

    【解决方案3】:

    这里是解决方案:

    Intent mIntent1 = new Intent(this, Activity1.class);
    mIntent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    Intent mIntent2 = new Intent(this, Activity2.class);
    Intent[] list = new Intent[2];
    list[0] = mIntent1;
    list[1] = mIntent2;
    startActivities(list);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多