如何将活动带到前台(栈顶)?
在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_TOP
和Intent.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是让广播接收机侦听通知触发的广播动作。 所以基本上:
-
通知会触发一个广播操作,并附加要启动的活动的名称。
-
当通知被点击时,广播接收器捕获这个信息,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创build一个启动该活动的意图
-
活动被带到活动堆栈的顶部,没有重复。
如果您使用“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());
再见!