Android:当通过单击通知打开应用程序时,单击其他通知只会打开应用程序,而不会更改活动

问题描述 投票:0回答:1

根据 StackOverflow 上的this thread,“Android 会记住用于启动它的意图”。那里描述的问题正是我正在经历的:

当应用程序首次从

Notification
启动时,这可能会把事情搞砸。您从
Notification
启动应用程序,Android 会记住使用的
Intent
(来自
Notification
),当您稍后启动应用程序(再次从
Notification
)时,Android 会匹配
Intent中的
Notification
 使用
Intent
 用于首次启动应用程序,并认为您想要将现有应用程序任务从后台带到前台。

问题:我不明白为什么Android认为Intent是相同的。虽然活动相同,但意图却完全不同。

当我向意图添加标志时,我能够解决此问题。例如:

Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK

但我的目标是保留后堆栈,当然它不使用这些标志。

这是一个带有一些附加屏幕的网络视图应用程序。

仅当通过通知启动应用程序时,此问题才存在。当我自己启动它并将其置于后台时,一切都按我的意愿进行。

场景

  • not1 = 带有活动 MainActivity 和额外内容的通知
    "openLink" =
    https://something.com/one
  • not2 = 活动 OtherActivity 和一些额外内容的通知
  • not3 = 带有活动 MainActivity 和额外内容的通知
    "openLink" =
    https://something.com/two
  • 应用程序已关闭。

我想要什么:

  1. 用户点击 not1,应用程序启动,打开 MainActivity,在 web 视图中打开链接
  2. 用户点击not2,应用程序打开OtherActivity
  3. 用户点击 not3,应用程序打开 MainActivity,在 web 视图中打开链接
  4. 用户点击“后退”,显示来自 not2 的其他活动
  5. 用户点击“后退”,显示来自 not1 的 MainActivity

现在怎么样:

  1. 用户点击 not1,应用程序启动,打开 MainActivity,在 Web 视图中打开链接 ✅
  2. 用户点击 not2,应用程序打开 OtherActivity ✅
  3. 用户点击not3,应用程序打开并显示OtherActivity。不调用 onCreate()。如果应用程序处于后台,则调用 OtherActivity 的 onResume()。即使它应该打开 MainActivity。

我的代码:

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。

进一步观察:

  • 如果我设置 android:taskAffinity="" 并且用户单击 not3 它可以工作,但会弄乱返回堆栈。它只是将 MainActivity 拉到后台堆栈前面。
  • 我无法按照 Android 文档所说的那样使用
    TaskStackBuilder
    ,因为这不会保留后堆栈。它只是允许你构建自己的后台堆栈(使用 webview 是不可能的)
android android-intent push-notification notifications android-notifications
1个回答
0
投票

独特的操作使得 Android 能够真正区分同一活动的意图:

newIntent.setAction(UUID.randomUUID().toString())

非常感谢@David Wasser 提供的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.