如何将活动带到前台(堆栈顶部)?

时间:2010-02-09 20:18:23

标签: android android-intent android-activity

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

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

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

如何编写代码才能实现?

9 个答案:

答案 0 :(得分:94)

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

答案 1 :(得分:55)

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

例如:

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

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

答案 2 :(得分:23)

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

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

答案 3 :(得分:8)

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 :(得分:4)

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

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

答案 5 :(得分:2)

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

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

答案 6 :(得分:1)

总的来说,我认为不推荐这种活动管理方法。在堆栈中重新激活两个步骤的活动的问题是此活动可能已被杀死。我的建议是记住您的活动状态并使用startActivity ()

启动它们

我确定您已查看此页面,但your convenience this link

答案 7 :(得分:0)

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

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

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

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

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

答案 8 :(得分:-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());

侨!