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

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

当我的应用程序启动时,这个A活动的一个实例被创build,说它是A 当用户点击A一个button时,B的另一个实例B被创build。 现在任务堆栈是BA,B在顶部。 然后,用户点击B上的一个button,C-Activity的另一个实例,C被创build。 现在任务堆栈是CBA,C在顶部。

现在,当用户点击C上的一个button时,我希望应用程序将A带到前台,即使A成为任务堆栈ACB的顶部。

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

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

我发现要做到这一点的最佳方式是使用Android主屏幕使用的相同意图 – 应用程序启动器。

例如:

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

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

这里是一个代码示例,你可以做到这一点:

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

我认为Intent标志的组合应该做的伎俩。 特别是, Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

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

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

一般来说,我认为不推荐这种活动pipe理方法。 重新激活活动中的两个步骤的问题是,此活动可能已被杀死。 我的build议记住你的活动的状态,并启动他们与startActivity ()

我相信你已经看到了这个页面,但为了您的方便,这个链接

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

注意你的homeactivity launchmode应该是single_task

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

我的解决scheme是让广播接收机侦听通知触发的广播动作。 所以基本上:

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

  2. 当通知被点击时,广播接收器捕获这个信息,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创build一个启动该活动的意图

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

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

单击通知将不会创build任何活动,最后一个活动活动将被恢复,从而保持当前状态而不会出现问题。

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

再见!