根据 StackOverflow 上的this thread,“Android 会记住用于启动它的意图”。那里描述的问题正是我正在经历的:
当应用程序首次从
启动时,这可能会把事情搞砸。您从Notification
启动应用程序,Android 会记住使用的Notification
(来自Intent
),当您稍后启动应用程序(再次从Notification
)时,Android 会匹配Notification
Intent
中的Notification
。使用用于首次启动应用程序,并认为您想要将现有应用程序任务从后台带到前台。Intent
问题:我不明白为什么Android认为Intent是相同的。虽然活动相同,但意图却完全不同。
当我向意图添加标志时,我能够解决此问题。例如:
Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK
但我的目标是保留后堆栈,当然它不使用这些标志。
这是一个带有一些附加屏幕的网络视图应用程序。
仅当通过通知启动应用程序时,此问题才存在。当我自己启动它并将其置于后台时,一切都按我的意愿进行。
场景
"openLink" =
https://something.com/one
"openLink" =
https://something.com/two
我想要什么:
现在怎么样:
我的代码:
val pendingIntent = PendingIntent.getActivity(
baseContext,
notificationId,
newIntent,
PendingIntent.FLAG_IMMUTABLE
)
notificationBuilder = notificationBuilder.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(notificationId, notificationBuilder.build())
notificationId 是唯一的。 newIntent 的附加功能是独一无二的。我尝试了我相信的每一个标志。 MainActivity(具有网络视图)的launchMode为“singleTop”,但当然我尝试不设置launchMode。
进一步观察:
TaskStackBuilder
,因为这不会保留后堆栈。它只是允许你构建自己的后台堆栈(使用 webview 是不可能的)独特的操作使得 Android 能够真正区分同一活动的意图:
newIntent.setAction(UUID.randomUUID().toString())
非常感谢@David Wasser 提供的解决方案。