编辑:我创建了一个示例应用程序来测试这个问题和可能的解决方案。以下是我的发现:
如果您从带有附加功能的通知启动您的应用程序,然后通过从最近任务列表中选择它返回到您的应用程序,Android 将再次启动应用程序,其方式与从通知启动的方式相同(即:具有附加功能)。这要么是一个错误,要么是一个功能,取决于你问的是谁。
您需要添加额外的代码来处理这种情况。我可以提供2个建议:
1.使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
创建通知时,Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
在Intent
. 然后,当用户选择通知并从通知中启动应用程序时,这不会在最近任务列表中为此任务创建条目。此外,如果此应用程序的最近任务列表中有一个条目,该条目也将被删除。在这种情况下,用户将无法从最近任务列表中返回此任务。这通过消除用户从最近任务列表中启动应用程序的可能性来解决您的问题(但仅当应用程序已从通知启动时)。
2.检测FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
当用户从最近的任务列表中启动您的应用程序时,Android会Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
在您的启动活动中设置标志。您可以检测到此标志的存在,然后您知道该应用程序已从最近的任务列表中启动,而不是从通知中启动。在这种情况下,您可以忽略额外内容中仍然包含数据的事实。Intent
onCreate()
onCreate()
Intent
选择最适合您的应用程序工作流程的解决方案。感谢您的提问,这是一个有趣的挑战:-)
附加信息:
您正在PendingIntent
错误地创建。你在打电话
PendingIntent contentIntent = PendingIntent.getActivity(this,
TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
new Intent(this, MainActivity.class).putExtra("is_log", true),
Intent.FLAG_ACTIVITY_CLEAR_TOP);
您将Intent.FLAG_ACTIVITY_CLEAR_TOP
作为第四个参数传递给getActivity()
. 但是,该参数应该是PendingIntent
标志。如果你想在FLAG_ACTIVITY_CLEAR_TOP
上设置Intent
,你需要这样做:
PendingIntent contentIntent = PendingIntent.getActivity(this,
TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
new Intent(this, MainActivity.class).putExtra("is_log", true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);