94

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

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

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

我如何编写代码来实现它?

4

9 回答 9

113

你可以试试这个FLAG_ACTIVITY_REORDER_TO_FRONT(文档准确地描述了你想要的)

于 2010-02-10T07:33:02.047 回答
66

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

例如:

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

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

于 2010-07-12T09:12:55.447 回答
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;
}
于 2012-02-13T11:36:59.840 回答
12

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);
于 2012-10-16T13:35:25.423 回答
4

我认为Intent标志的组合应该可以解决问题。特别是,Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

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

于 2010-02-09T23:10:47.467 回答
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

注意您的 homeactivity 启动模式应该是 single_task

于 2015-01-15T13:07:27.483 回答
1

总的来说,我认为不推荐这种活动管理方法。在 The Stack 中重新激活两个 Steps 中的活动的问题是该活动可能已被终止。我的建议是记住您的活动状态并启动它们startActivity ()

我确定您已经看过这个页面,但为了您的方便,这个链接

于 2010-02-10T03:44:01.460 回答
0

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

我的解决方案是制作一个广播接收器来监听通知触发的广播动作。所以基本上:

  1. 通知会触发一个广播操作,其中包含要启动的活动的额外名称。

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

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

于 2015-06-12T20:08:24.587 回答
-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());

再见!

于 2014-06-19T07:26:54.327 回答