我在使用PendingIntent
通过通知的NavDeepLinkBuilder
发送自变量时遇到一些困难。我可以通过单击通知来启动目标Activity
,但是Activity
的{{1}}不包含我通过{{1 }}。 Intent
返回我在导航图中设置的NavDeepLinkBuilder
-“ noJobId”。
创建通知:
Intent
通知中使用的defaultValue
是val notification =
NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
...
.setContentIntent(
NavDeepLinkBuilder(context)
.setComponentName(NewJobDetailsActivity::class.java)
.setGraph(R.navigation.main_graph)
.setDestination(R.id.newJobDetailsActivity)
.setArguments(
NewJobDetailsActivityArgs.Builder()
.setJobId(event.jobId)
.build()
.toBundle()
)
.createPendingIntent()
)
.build()
notificationManager.notify(notificationId, notification)
。
目的地context
FirebaseMessagingService
:
Activity
onCreate()
导航图:
val jobId: String = NewJobDetailsActivityArgs.fromBundle(intent?.extras).jobId
还有其他人遇到此问题吗?我觉得这是导航组件的错误,但我还不确定100%。好奇这里是否有我想念的东西。
依赖关系:android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha06,android.arch.navigation:navigation-ui-ktx:1.0.0-alpha06
插件:androidx.navigation.safeargs
答案 0 :(得分:2)
您可以在“活动/片段”的arguments
变量中找到发送的所有参数。
下面是一个示例,该示例说明如何检索由 NavDeepLinkBuilder()使用键String
创建的 PendingIntent 设置的EVENT_KEY
自变量目的地活动/片段:
requireArguments().getString(YourClass.EVENT_KEY)?.let { it } ?: ""
请注意,如果我们要查找的值不存在,我们的getString()
调用可能返回null,因此请确保已填充最终分配给Bundle
的{{1}}您想要的方式!
答案 1 :(得分:1)
我将此问题发布到Google的公共问题跟踪器上,并收到以下回复:
NavDeepLinkBuilder将其args传递给NavController进行深层链接 到特定的目的地。活动目的地确实更多 导航图的退出点,而不是可以/应该的点 紧密关联。
来源:https://issuetracker.google.com/issues/118964253
该引文的作者建议在创建目的地为TaskStackBuilder
的{{1}}时使用NavDeepLinkBuilder
而不是PendingIntent
。这就是我最终要去的事情:
Activity
该解决方案使我能够成功地深度链接至目标NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
...
.setContentIntent(
TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(Intent(context, DestinationActivity::class.java).apply {
putExtras(DestinationActivityArgs.Builder(jobId).build().toBundle())
})
getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
}
)
.build()
,同时仍然能够通过生成的Activity
生成器引用该导航Activity
中定义的args,并且从目标DestinationActivityArgs
的{{1}}方法访问args是可行的。
此解决方案还可以正确处理以下情况:应用程序任务不在“最近使用的应用程序”列表中,应用程序在前台显示其他Activity
或onCreate()
或应用程序在前景并且已经在目的地Activity
上。 Fragment
可以正确处理向上导航,因此从目标Activity
单击向上按钮可导航回到addNextIntentWithParentStack()
中定义的逻辑父级Activity
。
有点遗憾的是,该解决方案没有直接利用导航体系结构库来构建Activity
,但这似乎是最好的选择。
答案 2 :(得分:-1)
我遇到了同样的问题,我的包总是返回 null,这对我有用:
在我的片段上,我有一个传递包的方法:
notificationManager.sendNotification(
requireArguments(), // This gets me the arguments supplied when the fragment in instantiated
requireContext()
)
在我的 notificationUtils 上,我的内容意图是:
fun NotificationManager.sendNotification(
bundle: Bundle,
appContext: Context
) {
val contentIntent = NavDeepLinkBuilder(appContext)
.setComponentName(MainActivity::class.java)
.setGraph(R.navigation.navigation)
.setDestination(R.id.detailsFragment)
.setArguments(bundle)
.createPendingIntent()
// Rest of code to build the notification...
}
为了测试包是否被正确传递,我记录如下:
Timber.d("The name is: ${bundle.getParcelable<Person>("Person")?.name}")