通过通知开始活动:避免重复活动

问题描述:

因此,我目前正在显示通知。当用户点击这个通知时,应用程序就会启动。通知仍然存在,表明服务正在后台运行。通过通知开始活动:避免重复活动

Intent notificationIntent = new Intent(context, LaunchActivity.class); 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 
mNotificationManager.notify(1, notification); 

但是,我发现了一个错误出现的情况。如果用户通过单击正常图标启动应用程序,并且活动正在运行时单击该通知,则会启动一个新的活动,而不在先前的活动退出,而后者位于早期的活动之上。这还不是全部:进一步点击通知将创建额外的活动,并将它们放在已经运行的活动之上。我怎样才能防止这一点?是否有一个很好的检查来确定某个活动目前是正在显示还是已加载?

这就是它应该默认的方式。如果您只想要单个实例,则可能需要指定android:launchMode="singleTop"
有4种发射模式,这里更多的信息:https://developer.android.com/guide/topics/manifest/activity-element.html

+7

将其设置为“singleTask”解决我的问题。谢谢你的协助! – pgsandstrom 2010-02-25 09:05:32

当使用lanchMode="singleTask",如果你的活动的实例已经存在,Android不重新创建活动,但与onNewIntent()方法启动它。

如记录由Android:

该系统在一个新的任务和路线的意图,它的根目录创建活动。但是,如果活动的实例已经存在,则系统通过调用onNewIntent()方法将意图路由到现有实例,而不是创建新实例。

Android documentation for activity mode

由于两个答案上面所提到的,你要的是设定在活动的定义定义清单中的应用程序的启动模式:

<activity 
    android:name="com.company.ActivityName" 
    android:launchMode="singleTask"> 
</activity> 

另外,您可能要注意的是,尽管FLAG_ACTIVITY_SINGLE_TOP是一个有效的Intent标志,但没有用于singleTask或singleInstance的等效意图标志。

详情请参见在不同的启动模式选项的launchMode部分:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

+1

是FLAG_ACTIVITY_NEW_TASK不等于singleTask? – CopsOnRoad 2018-01-02 14:43:01