在Android中,我定义了一个活动ExampleActivity。
启动我的应用程序时,创建了该A-Activity的实例,例如A
。当用户单击中的按钮时A
,B活动的另一个实例B被创建。现在,任务堆栈为BA,顶部为B。然后,用户单击C-Activity的另一个实例B上的按钮,并创建了C。现在,任务堆栈是CBA,顶部是C。
现在,当用户单击C上的按钮时,我希望应用程序将A带到前台,即使A位于任务堆栈ACB的顶部。
如何编写代码使其实现?
Answers:
您可以尝试使用此方法FLAG_ACTIVITY_REORDER_TO_FRONT
(该文档准确地描述了您想要的内容)
FLAG_ACTIVITY_SINGLE_TOP
在这里无济于事。当ActivityC位于堆栈的顶部并调用startActivity()
启动ActivityA时,即使您进行了设置,FLAG_ACTIVITY_SINGLE_TOP
它仍将创建一个ActivityA 的新实例。FLAG_ACTIVITY_SINGLE_TOP
仅当您尝试启动已经位于堆栈顶部的活动时,才阻止创建新实例。在这种情况下,ActivityA不在堆栈的顶部,因此Android创建了一个新实例。
(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)
清除给定后的所有历史记录Activity
。
我发现做到这一点的最佳方法是使用与Android主屏幕相同的意图-应用启动器。
例如:
Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
这样,用户最近使用我包中的任何活动都会再次回到最前面。我发现这在使用服务的PendingIntent使用户回到我的应用程序中很有用。
Activity
在任务堆栈中重新排列。OP明确指出他想ActivityA
从堆栈底部移动到堆栈顶部(即:他想将ActivityA重新排序到任务堆栈的前面)。这个答案不会那样做。该答案是对以下问题的答案:“如何将我的应用程序(任务堆栈)从后台移到前台?” 这是与OP原始问题完全不同的问题。
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);
我认为结合使用Intent
标记应该可以解决问题。特别是Intent.FLAG_ACTIVITY_CLEAR_TOP
和Intent.FLAG_ACTIVITY_NEW_TASK
。
在调用之前将这些标志添加到您的意图中startActvity
。
如果要在单击通知时将活动置于堆栈顶部,则可能需要执行以下操作以使FLAG_ACTIVITY_REORDER_TO_FRONT起作用:
对于我来说,解决方案是使广播接收器侦听通知触发的广播操作。所以基本上:
通知会触发广播操作,并带有要启动的活动的名称。
单击通知时,广播接收器会捕获到此消息,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创建启动该活动的意图
活动被带到活动堆栈的顶部,没有重复项。
如果您使用“ 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());
再见!