意图 – 如果活动正在运行,把它放在前面,否则启动一个新的(从通知)

我的应用程序有通知,显然,没有任何标志,每次都会开始一个新的活动,所以我得到了多个相同的活动在彼此之上运行,这是错误的。

我希望它做的是将通知中指定的活动挂起来的意图,如果它已经在运行,否则启动它。

到目前为止,我有这个通知的意图/待决意图是

private static PendingIntent prepareIntent(Context context) { Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } 

奇怪的是,它有时是有效的,有时候不会…我觉得我已经尝试了每一个标志的组合。

你可以使用这个:

 <activity android:name=".YourActivity" android:launchMode="singleTask"/> 

这将工作类似"singleInstance"但它不会有怪异的animation。

我认为最简单的方法就是正常启动活动,但是使用singleInstance属性在清单中设置该活动。 有了这个,你就可以实际地处理你现在正在处理的两个问题,将活动始终带到最前面,如果没有任何活动,或者将当前活动带到前面,让操作系统自动创build一个新的活动(感谢singleInstance属性)。

这是活动被声明为单个实例的方式:

 <activity android:name=".YourActivity" android:launchMode="singleInstance"/> 

另外为了避免在通过singleInstance启动时出现波涛汹涌的animation,你可以使用“singleTask”,两者非常相似,但是这里的区别在Google文档中有解释:

 <activity android:name=".YourActivity" android:launchMode="singleTask"/> 

singleInstance与“singleTask”相同,只是系统不会将任何其他活动发送到持有该实例的任务中。 该活动始终是其任务的唯一成员。

希望这可以帮助。

问候!

我认为你需要在singleTop Activity ,而不是singleTasksingleInstance

 <activity android:name=".MyActivity" android:launchMode="singleTop" ...the rest... > 

文档所说的完全符合您的需求:

也可以创build一个“ singleTop ”活动的新实例来处理新的意图。 但是,如果目标任务已经在其堆栈顶部存在一个活动的现有实例,那么该实例将接收新的目标(在onNewIntent()调用中)。 一个新的实例不会被创build。 在其他情况下,例如,如果“ singleTop ”活动的现有实例位于目标任务中,但不在堆栈顶部,或者位于堆栈顶部,但不在目标任务中 -新的实例将被创build并推入堆栈。

除此之外,我和你的需求完全一样。 我testing了所有的launchMode标志,找出它们在实际中的实际行为,结果singleTop实际上是最好的:没有奇怪的animation,应用程序在最近的应用程序列表中显示一次(不像singleInstance显示两次,因为事实它不允许任何其他Activity成为其任务的一部分),并且适当的行为,而不pipe目标Activity已经存在或不存在。

既然你说你要开始你的活动,如果它还没有开始,也许你不会介意重新启动它。 我也为这个意图testing了大量的build议和标志组合,但是它总是会把你需要的活动带到最前面,尽pipe它不会保留任何以前与之相关的状态。

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 

只有API11 +。

我试过这个,即使IDE在抱怨代码,它也能工作

 Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT) .setSmallIcon(R.drawable.cast_ic_notification_0) .setContentTitle("Title") .setContentText("Content") .setContentIntent(intent) .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5; .setAutoCancel(true) /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/; NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build()); 

我知道它已经老了,但是上面没有任何东西适合我的申请。

在不更改清单和其他configuration的情况下,这里是将应用程序放回原处的代码 – 或者在closures时打开它

 Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); notificationIntent.setPackage(null); // The golden row !!! notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);