通过NavDeepLinkBuilder的PendingIntent发送参数

时间:2018-10-18 15:15:55

标签: android android-activity android-notifications android-bundle android-architecture-navigation

我在使用PendingIntent通过通知的NavDeepLinkBuilder发送自变量时遇到一些困难。我可以通过单击通知来启动目标Activity,但是Activity的{​​{1}}不包含我通过{{1 }}。 Intent返回我在导航图中设置的NavDeepLinkBuilder-“ noJobId”。

创建通知

Intent

通知中使用的defaultValueval 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

3 个答案:

答案 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是可行的。

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

有点遗憾的是,该解决方案没有直接利用导航体系结构库来构建Activity,但这似乎是最好的选择。

答案 2 :(得分:-1)

我遇到了同样的问题,我的包总是返回 null,这对我有用:

  1. 在我的片段上,我有一个传递包的方法:

    notificationManager.sendNotification(
        requireArguments(), // This gets me the arguments supplied when the fragment in instantiated
        requireContext()
    )
    
  2. 在我的 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... 
    }
    
  3. 为了测试包是否被正确传递,我记录如下:

    Timber.d("The name is: ${bundle.getParcelable<Person>("Person")?.name}")