Android:同一意图启动多个活动实例。如何唯一将一个实例带到前台?

3
我正在努力解决一个应用程序问题,该应用程序使用相同的意图启动多个实例的同一活动。我的主要活动是A类类型,并且它执行了两个子活动的startActivity(),这些子活动都是B类类型。因此,我们启动了B1和B2。如果B1和B2都处于暂停状态(通过按返回按钮并确保没有在它们上调用finish(),以便它们真正处于暂停状态),那么如何使A唯一地将B1或B2再次带到前台?我确实想要启动一个新的B活动。我想唯一地将B1或B2带到前台。
所以B1和B2都是这样创建的... Intent intent = new Intent(context, B.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
现在我想让A将B1(或B2)带到前台,所以我使用下面的代码,但是当启动活动时如何区分B1或B2?这只会将最后一个处于顶部的B实例带到前台。
Intent intent = new Intent(context, B.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent);
我尝试保留对B1和B2的引用并执行以下操作,但是这也只会转到B类活动的最后一个实例,该实例位于顶部...
Intent intent = new Intent(B1context, B.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); B1context.startActivity(intent);
我甚至尝试了这个,但它仍然不能让我得到我的唯一的B1或B2... Intent intent = B1.getIntent(); //即启动我的原始意图 startActivity(intent); //仍然只将最后一个处于顶部的B带到前台。
提前感谢!

要不你试试让 C 继承 B,这样 B 就成为了 B1,C 就成为了 B2?这真的没有回答你的问题,但如果没有人能回答,你可以尝试使用这个方法。 - apps
也许你可以通过 <activity-alias> 来实现它。你需要将 B1 和 B2 分开成不同的组件,通常会是不同的活动类。 - CommonsWare
2个回答

0

基本上你不能这样做。NEW_TASK 的目的是启动用户视为独立的“应用程序”。如果你试图使用它来操纵应用程序的流程,那么你就滥用了它(并且会破坏最近任务等功能)。

你可以通过子类使它们成为实际的独立类来解决这个问题,但在这样做之前,请停下来思考一下你所做的是否正确。只有少数情况下应该使用 NEW_TASK——启动器、从通知切换等。在所有这些情况下,用户启动的内容都具有相当独特的标识。无论你正在做什么,都应该保持这些语义。


0

这是解决方案:

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接