意图 – 如果活动正在运行,把它放在前面,否则启动一个新的(从通知)
我的应用程序有通知,显然,没有任何标志,每次都会开始一个新的活动,所以我得到了多个相同的活动在彼此之上运行,这是错误的。
我希望它做的是将通知中指定的活动挂起来的意图,如果它已经在运行,否则启动它。
到目前为止,我有这个通知的意图/待决意图是
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
,而不是singleTask
或singleInstance
。
<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);