gpt4 book ai didi

android - 通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

转载 作者:太空狗 更新时间:2023-10-29 13:03:02 27 4
gpt4 key购买 nike

我在使用 NavDeepLinkBuilder 通过通知的 PendingIntent 发送参数时遇到了一些困难。我可以通过单击通知启动目标 Activity,但 ActivityIntent 不包含参数值我通过 NavDeepLinkBuilder 传递了它。 Intent 而是返回我在导航图中设置的 defaultValue - “noJobId”。

通知创建:

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)

通知中使用的 contextFirebaseMessagingService

目标 Activity onCreate():

val jobId: String = NewJobDetailsActivityArgs.fromBundle(intent?.extras).jobId

main_graph.xml 导航图:

<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_graph"
app:startDestination="@id/jobsFragment">

<fragment
android:id="@+id/jobsFragment"
android:name=".ui.jobs.JobsFragment"
android:label="JobsFragment">

<action
android:id="@+id/action_jobsFragment_to_newJobDetailsActivity"
app:destination="@id/newJobDetailsActivity" />

</fragment>

<fragment
android:id="@+id/historyFragment"
android:name=".ui.history.HistoryFragment"
android:label="HistoryFragment" />

<fragment
android:id="@+id/profileFragment"
android:name=".ui.profile.ProfileFragment"
android:label="ProfileFragment" />

<activity
android:id="@+id/newJobDetailsActivity"
android:name=".ui.job.NewJobDetailsActivity"
android:label="activity_new_job_details"
tools:layout="@layout/activity_new_job_details">

<argument
android:name="jobId"
android:defaultValue="noJobId" // just for testing
app:argType="string" />

</activity>

</navigation>

有没有其他人遇到过这个问题?我感觉这是导航组件的错误,但我还不能 100% 确定。想知道我是否遗漏了什么。

依赖:android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha06, android.arch.navigation:navigation-ui-ktx:1.0.0-alpha06

插件:androidx.navigation.safeargs

最佳答案

我在 Google 的公共(public)问题跟踪器上发布了这个问题,并收到了以下回复:

NavDeepLinkBuilder passes its args to a NavController to deep link into a specific destination. Activity destinations are really more exit points from a navigation graph than something that can/should be deep linked to.

来源:https://issuetracker.google.com/issues/118964253

该引用的作者建议使用 TaskStackBuilder而不是 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通过生成的 DestinationActivityArgs构建器,并从目标访问参数 ActivityonCreate()方法有效。

此解决方案还可以正确处理应用程序任务不在“最近的应用程序”列表中、应用程序在前台显示其他 Activity 的情况。或 Fragment ,或者应用程序在前台并且已经在目的地 Activity . addNextIntentWithParentStack()正确处理向上导航,所以从目的地点击向上按钮 Activity导航回逻辑父级 ActivityAndroidManifest 中所定义.

这个解决方案没有直接使用导航架构库来构建 PendingIntent,这有点令人遗憾。 ,但这感觉是最好的选择。

关于android - 通过 NavDeepLinkBuilder 的 PendingIntent 发送参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52877277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com