通过通知启动Activity:避免重复启动活动

31

我当前正在显示一个通知。当用户点击此通知时,应用程序会启动。该通知将持续存在,以指示服务在后台运行。

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);

但是,我发现了一个Bug的情况。如果用户通过点击正常图标启动应用程序,并在活动运行时单击通知,则会启动一个新的活动,而旧的活动不会退出,后者位于前者的顶部。这还不是全部:进一步点击通知将创建其他活动并将它们放置在已经运行的活动之上。如何防止这种情况?是否有一种很好的检查方法来查看某个活动当前是否正在显示或已加载?

3个回答

43

9
将其设置为"singleTask"解决了我的问题。感谢您的帮助! - pgsandstrom

13

当使用lanchMode="singleTask"时,如果您的Activity已经存在一个实例,Android将不会重新创建该Activity,而是通过调用onNewIntent()方法启动它。

根据Android文档:

系统会在新任务的根处创建该Activity并将Intent路由到它。但是,如果该Activity的实例已经存在,则系统会通过调用其onNewIntent()方法将Intent路由到现有实例,而不是创建新实例。

Android活动模式文档


3

如上两个答案所述,您需要设置应用程序的启动模式,该模式在清单中定义了活动的定义:

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

此外,你可能需要注意一点,尽管FLAG_ACTIVITY_SINGLE_TOP是一个有效的Intent标志,但是singleTask或singleInstance没有相应的intent标志。
有关不同启动模式选项的更多详细信息,请参见launchMode部分:http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

1
FLAG_ACTIVITY_NEW_TASK和singleTask不等同吗? - CopsOnRoad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接