如何将活动置于前台(堆栈顶部)?


90

在Android中,我定义了一个活动ExampleActivity。

启动我的应用程序时,创建了该A-Activity的实例,例如A。当用户单击中的按钮时A,B活动的另一个实例B被创建。现在,任务堆栈为BA,顶部为B。然后,用户单击C-Activity的另一个实例B上的按钮,并创建了C。现在,任务堆栈是CBA,顶部是C。

现在,当用户单击C上的按钮时,我希望应用程序将A带到前台,即使A位于任务堆栈ACB的顶部。

如何编写代码使其实现?

Answers:


108

您可以尝试使用此方法FLAG_ACTIVITY_REORDER_TO_FRONT(该文档准确地描述了您想要的内容)


3
我认为应该是FLAG_ACTIVITY_SINGLE_TOP

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOP在这里无济于事。当ActivityC位于堆栈的顶部并调用startActivity()启动ActivityA时,即使您进行了设置,FLAG_ACTIVITY_SINGLE_TOP它仍将创建一个ActivityA 的新实例FLAG_ACTIVITY_SINGLE_TOP当您尝试启动已经位于堆栈顶部的活动时,才阻止创建新实例。在这种情况下,ActivityA不在堆栈的顶部,因此Android创建了一个新实例。
David Wasser

6
太棒了!用于(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)清除给定后的所有历史记录Activity
shkschneider 2015年

10
如果还指定了FLAG_ACTIVITY_CLEAR_TOP,则将忽略FLAG_ACTIVITY_REORDER_TO_FRONT。检查文档。
克里斯·斯伯拉曼尼亚

3
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); 如果您想将活动放在用户会话的最前面,而该活动已经位于后台程序的顶部,而不是位于最前面,则此方法会很好用。
哈桑·贾米尔

63

我发现做到这一点的最佳方法是使用与Android主屏幕相同的意图-应用启动器。

例如:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

这样,用户最近使用我包中的任何活动都会再次回到最前面。我发现这在使用服务的PendingIntent使用户回到我的应用程序中很有用。


2
非常感谢那段代码。我浪费了很多时间试图使它正常工作。
PakitoV

3
或者没有组件名称和setComponent,但随着新的意图(这一点,MyMainActivity.class)
梯玛

3
很奇怪,因为这是唯一对我有用的东西;设置标记无效,并且总是重新创建活动。
史蒂文·黄

5
当我阅读此答案和评论时,很明显我们有误会。最初的问题是询问如何Activity在任务堆栈中重新排列。OP明确指出他想ActivityA从堆栈底部移动到堆栈顶部(即:他想将ActivityA重新排序到任务堆栈的前面)。这个答案不会那样做。该答案是对以下问题的答案:“如何将我的应用程序(任务堆栈)从后台移到前台?” 这是与OP原始问题完全不同的问题。
大卫·瓦瑟

3
同样upvote按钮会显示“此答案有帮助”,而不是“此答案对操作有帮助”-他/她已经为这种情况设置了“接受标记”。显然,我不知道对操作有什么帮助,恕我直言,根据我的猜测,我认为对操作有帮助的答案是错误的。
鲍里斯·特鲁霍夫

28

这是如何执行此操作的代码示例:

Intent intent = getIntent(getApplicationContext(), A.class)

这样可以确保堆栈上只有一个活动实例。

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT:如果在传递给Context.startActivity()的Intent中进行设置,则此标志将使已启动的活动(如果已在运行中)置于其任务的历史记录堆栈的最前面。

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

我认为结合使用Intent标记应该可以解决问题。特别是Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

在调用之前将这些标志添加到您的意图中startActvity


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

注意您的家庭活动启动模式应为single_task


1

通常,我认为不建议使用这种活动管理方法。重新激活“堆栈”中的“降低两个步骤”活动的问题在于,该活动可能已被杀死。我的建议是记住您的活动状态并以startActivity ()

我确定您已经看过此页面,但为方便起见,此链接


0

如果要在单击通知时将活动置于堆栈顶部,则可能需要执行以下操作以使FLAG_ACTIVITY_REORDER_TO_FRONT起作用:

对于我来说,解决方案是使广播接收器侦听通知触发的广播操作。所以基本上:

  1. 通知会触发广播操作,并带有要启动的活动的名称。

  2. 单击通知时,广播接收器会捕获到此消息,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创建启动该活动的意图

  3. 活动被带到活动堆栈的顶部,没有重复项。


-2

如果您使用“ Google Cloud Message”接收带有“ PendingIntent”类的推送通知,则以下代码仅在操作栏中显示通知。

单击通知将不创建任何活动,将恢复上一个活动活动,并保持当前状态而不会出现问题。

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

再见!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.