2010-02-09 63 views
63

在Android中,我定义了一个活动ExampleActivity。如何将活动引入前景(堆栈顶部)?

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

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

我该如何编写代码才能实现它?

回答

80

你可以试试这个FLAG_ACTIVITY_REORDER_TO_FRONT(文档描述要什么)

+3

我觉得应该是[FLAG_ACTIVITY_SINGLE_TOP(http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP)。 – 2012-05-17 11:18:44

+19

@ user942821'FLAG_ACTIVITY_SINGLE_TOP'在这里没有帮助。当ActivityC位于堆栈的顶部并且它调用'startActivity()'来启动ActivityA时,即使您设置了“FLAG_ACTIVITY_SINGLE_TOP”,它仍然会创建一个ActivityA的**新实例**。如果您尝试启动已经位于堆栈顶部的活动**,则“FLAG_ACTIVITY_SINGLE_TOP”只会阻止创建新实例**。在这种情况下,ActivityA不在栈顶,所以Android创建一个新的实例。 – 2013-03-21 10:34:34

+4

太棒了!使用'(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)'在给定的'活动'后清除任何历史记录。 – shkschneider 2015-06-09 15:48:14

4

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

在致电startActvity之前,将这些标志添加到您的意图中。

1

一般来说,我认为不推荐这种活动管理方法。重新激活活动中两个步骤的问题是,该活动可能已被杀死。我的建议是到记住你的活动的情况,并startActivity()

发动他们,我敢肯定,你已经看到了这个页面,但为your convenience this link

48

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

例如:

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

这样一来,我的包中任何活性最近使用的用户再次带回前。我发现这在使用我的服务的PendingIntent将用户带回我的应用程序中很有用。

+0

非常感谢那段代码。我浪费了几个小时试图让它正常工作。 – Emilio 2011-11-14 14:59:46

+2

或没有ComponentName和setComponent,但与新的意图(这,MyMainActivity.class) – Tima 2011-11-17 16:28:40

+0

我猜2010年的文档和标准稀疏,这不是正确的答案。 – ashishduh 2014-08-07 21:47:25

17

这里是你如何能做到这一个代码,例如:

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

FLAG_ACTIVITY_REORDER_TO_FRONT: 如果传递给Context.startActivity()的意图设置,该标志将导致启动的活动被带到其任务的历史堆栈的前方,如果它已经在运行。

Intent i = new Intent(context, AActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(i); 
-1

如果您使用“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());

的Ciao!

1

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

注意你的homeactivity launchmode应single_task

0

如果你想在一个通知,当点击带来的活动堆栈的顶部,那么你可能需要做以下,使FLAG_ACTIVITY_REORDER_TO_FRONT工作:

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

  1. 通知触发一个广播操作与一个额外的启动活动的名称。

  2. 广播接收机捕获此被点击的通知时,然后创建的意图使用FLAG_ACTIVITY_REORDER_TO_FRONT标志

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