通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

2024-01-08

我在通过电子邮件发送论点时遇到一些困难PendingIntent的通知使用NavDeepLinkBuilder。我能到达目的地Activity通过单击通知来启动,但是Activity's Intent不包含我通过它传递的参数值NavDeepLinkBuilder. The 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)

The context通知中使用的是FirebaseMessagingService.

目的地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

Plugin:androidx.navigation.safeargs


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

NavDeepLinkBuilder 将其参数传递给 NavController 以进行深层链接 进入特定目的地。活动目的地确实多了 导航图的退出点比可以/应该的东西 深深地联系在一起。

Source: https://issuetracker.google.com/issues/118964253 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构建器,并从目标访问参数Activity's onCreate()方法有效。

此解决方案还可以正确处理应用程序任务不在“最近的应用程序”列表中、应用程序位于前台显示其他一些内容的情况Activity or Fragment,或者应用程序位于前台并且已位于目的地Activity. addNextIntentWithParentStack()正确处理向上导航,因此单击目的地的向上按钮Activity导航回逻辑父级Activity如定义在AndroidManifest.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 NavDeepLinkBuilder 的 PendingIntent 发送参数 的相关文章

  • Eclipse IDE - 错误:构建路径指定执行环境 Java SE 1.7

    在 Eclipse 中 我收到一个错误 构建路径指定执行环境Java SE 1 7 工作区中没有安装与此环境严格兼容的 JRE 尝试这个 In Eclipse your project gt properties gt java build
  • List 与 IEnumerable 的协变和逆变

    所以 假设我有 Public Interface ISomeInterface End Interface Public Class SomeClass Implements ISomeInterface End Class 如果我有MyL
  • 如何在express中动态渲染/加载页面?

    我需要使用express gt 3 0 框架动态加载 渲染nodejs v1 8 15 中页面的一部分 一般来说 我想创建一个单页应用程序 我在页面顶部有一个带有链接的菜单 单击链接将更改下面的内容 就像 AJAX 页面加载一样 例如 gt
  • 使用 mongoimport 从 Windows 文件夹批量导入 MongoDB

    我的存档中有很多 json 文件 我需要将它们导入到 mongo 每一个操作中 我认为它可能是循环的 你对此有什么想法吗 如果您使用的是 Linux Unix shell 您可以尝试 for filename in do mongoimpo
  • 只允许在输入字段中输入数字

    我想要打开电话号码字段这个网站 http myfrugaltech com dev savoo register 只接受数字或数字 我无权编辑 HTML 代码 那么可以使用 jQuery 通过定位字段 ID 来完成此操作吗 如果可以的话 该
  • Jsplitpane 自动调整大小

    我有一个 JSPlitPane 它们之间有 50 的分隔线 这工作正常 但是 当我在右侧添加一些 JLabels 时 jsplitpane 会忽略我的 50 分隔符 左侧窗格会增加其大小 并会挤压右侧窗格 为什么会发生这种情况以及如何解决
  • 如何使用 Typescript 将 jest.spyOn 与 React 函数组件一起使用

    我正在使用 Typescript 和 hooks 开发一个 React 应用程序 并且尝试使用 Enzyme 和 Jest 来测试功能组件 我无法使用 jest spyOn 来测试我的组件中的方法 jest spyOn 方法无法正确解析并在
  • 如何从 fetch API 返回 json 响应

    我有一个像这样的函数 check auth fetch Urls check auth credentials include method GET then response gt if response ok return respon
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable
  • 在 JSON 对象中存储和发送原始文件数据

    我正在寻找一种方法来传输任何文件类型的原始文件数据和任何可能的内容 我的意思是文件和文件内容都是用户生成的 在 Backbone 前端中使用 xhr ajax 调用两种方式针对 Django 后端 编辑 也许问题仍然不清楚 如果您在 IDE
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们
  • 无法使用 Struts 2 重定向 JSP 文件并显示值

    我创建了一个简单的程序 使用文本字段获取用户的名字和姓氏 但问题是 当我单击提交按钮时 我无法将其重定向到另一个显示用户名字和姓氏的 jsp 文件 这是我的HelloAction class package com novamsc trai
  • 如何使用 Spring Security 手动注销用户?

    也许答案很简单 如何在 Spring Security 中手动注销当前登录的用户 拨打电话是否足够 SecurityContextHolder getContext getAuthentication setAuthenticated fa
  • VSTS部署IIS应用程序winrm并更改appsettings.json

    我正在使用 部署 IIS 应用程序 winrm 任务在另一台计算机上部署 IIS 应用程序 此任务部署 zip 文件 在此 zip 中有一个 appsettings json 其变量以下划线开头和结尾 我需要替换每个环境的 appsetti
  • 删除 IF ELSE 语句中的临时表

    我在这里面临僵局 问题是我必须更改使用 3 个不同临时表的过程 为了便于对话 让我们将它们命名为 temptable1 temptable2 temptable3 我无法在这里复制 粘贴整个过程 但总体思路是这样的 原始过程 procedu
  • 用于清除工作空间和转储存储的 R 全局函数

    我希望创建一个全局函数来清除我的工作区并转储我的内存 我将我的函数称为 cleaner 并希望它执行以下代码 remove list ls gc 我尝试在全局环境中创建该函数 但是当我运行它时 控制台仅打印该函数的文本 在我要获取的函数文件
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 使用 TABLE_DATE_RANGE 时如何获取表名称

    我想使用 TABLE DATE RANGE 获取每日统计信息 如下所示 Select count tableName FROM TABLE DATE RANGE appengine logs appengine googleapis com
  • 如何将 pygame Surface 转换为 PIL 图像?

    我正在使用 PIL 来透视地变换屏幕的一部分 原始图像数据是一个 pygame Surface 需要转换为 PIL 图像 因此我发现了 pygame 的 tostring 函数就是为了这个目的而存在的 然而结果看起来很奇怪 见附图 这段代码
  • Razor 视图类型不继承自“System.Web.WebPages.WebPage”

    我在配置 ASP NET MVC 应用程序时遇到问题 HttpException 0x80004005 Type ASP Page Currency Index cshtml does not inherit from System Web

随机推荐

  • TFS 2017 版本定义。 WinRM - IIS Web 应用程序管理任务。在“默认网站”下创建应用程序

    我正在制定一个发布定义 它将把一个网站部署到测试 IIS 服务器 Windows Server 2012 IIS 8 我想使用 IIS Web 应用程序管理任务在 默认网站 Scott 下创建和配置应用程序或虚拟目录 当我指定 默认网站 S
  • 为什么 google.load 会导致我的页面变成空白?

    嗯 这看起来很奇怪 但我找不到解决方案 为什么这个小提琴会演奏http jsfiddle net carlesso PKkFf http jsfiddle net carlesso PKkFf 显示页面内容 然后当 google load
  • PHP 友元/包可见性

    有没有办法限制 PHP 中的可见性 就像 Java 中的 包 可见性或至少 C 中的 朋友 可见性一样 维护大型 OOP 项目并且不让任何人使用代码的任何部分的最佳实践是什么 我尽可能多地使用私有和受保护的可见性 但有时这还不够 我知道这个
  • Angularjs - 使用指令添加 ng-* 属性

    我正在尝试将简单的 ng mouseover 绑定添加到由指令管理的元素 但无法让它发挥作用 http jsbin com aqibij 2 edit http jsbin com aqibij 2 edit 我尝试在添加 ng mouse
  • 使用本地 JSON 文件填充 Jtable

    我试图从 json 文件中获取所有数据并将数据填充到 jtable 中 我已经从 json 文件中获取数据并打印输出 但是当我尝试将数据填充到 jtable 中时 我无法将数据放入 jtable 中我的循环最终将插入数据的帧相乘 请帮助我
  • 如何在 Gluon 项目中引用 android.jar

    上面是我在 Android 上部署 JavaFX 的 Gluon 项目 我的问题是我无法引用 android jar 如何解决这个问题 构建 gradle buildscript repositories jcenter dependenc
  • PHP 中声明不必要的变量会消耗内存吗?

    我通常在 PHP 中这样做是为了更好的可读性 但我不知道它是否消耗内存或有其他问题 假设我有这个代码 user getUser getUser will return an array 我可以做 email user email sendE
  • 是否可以在 React 的 useEffect 中使用自定义钩子?

    我有一个非常基本的自定义挂钩 它接受路径并从 firebase 返回文档 import React useState useEffect useContext from react import FirebaseContext from s
  • 在抛出异常时中断捕获的异常

    在 VS 调试器中 未捕获的异常会导致程序在抛出异常时 或足够接近 中断 并处于一种允许您查看该点之前的所有堆栈帧和局部变量的状态 有没有办法获得相同的结果 抛出时中断 但在特定点捕获异常 我对对所有异常甚至给定类型的所有异常执行此操作不感
  • FFT - 计算频率仓之间的精确频率

    我在用我在网上找到的一个不错的 FFT 库 http www corix dk Mix FFT mix fft html看看我是否可以编写一个音高检测程序 到目前为止 我已经能够成功地让库对包含一些正弦波的测试音频信号进行 FFT 计算 其
  • 从 python 内部触发 catkin 构建过程

    我正在编写一个 python 脚本来组织一个由多个存储库组成的项目 一些目标是使用catkin构建的 由于catkin是一个python工具 我怀疑必须有一种方法来调用等效的catkin build来自 python 脚本 然而 我正在努力
  • 在自定义指令中模拟 v-if 指令

    我需要销毁 v if 等自定义指令中的元素 如果条件失败 则禁止创建项目 我尝试这个 export const moduleDirective DirectiveOptions DirectiveFunction el binding vn
  • 如何使用 MailMessage 在 powershell 电子邮件中嵌入图像

    我有一封可以在 PS 上使用的电子邮件 我一直在尝试做的是将图像嵌入到电子邮件中 而不是附件 以下是我到目前为止所拥有的 function Email smtpServer smtp server smtpFrom email from s
  • 1969 年 12 月 31 日晚上 7:00 发生了什么

    每次在 PHP 中创建一个如下变量时 date strtotime row date date date M d Y a t g i A date Mmm dd YYYY at h mm PM AM 不知何故row date 恰好是 0 日
  • C# 将 string,int,string 存储在可访问变量中

    我需要保存一个包含静态国家 地区列表的类以进行缓存 数据是用 string shortName Primary Key IL or UK for example int ID Unique has no meaning but needs
  • 离子造型 2 吐司

    有什么方法可以在 ionic 2 toast 中设置文本消息的样式吗 我已经尝试过这个 let toast Toast create message Some text on one line br br Some text on anot
  • Qt 有没有办法强制 QMediaPlayer 缓冲文件而不播放它?

    当您将文件加载到QMediaPlayer例如 它不会自动缓冲文件 这MediaStatus遗迹NoMedia直到您使用播放文件play 只有在此之后它才会最终成为BufferedMedia 我在文档中找不到任何方法来强制播放器缓冲文件而不播
  • 对 ASP.Net Web 应用程序的 App_Code 进行单元测试

    我想创建一个 ASP Net Web 应用程序 并且想为其编写单元测试 但我的单元测试项目看不到我的 Web 应用程序的 App Code 目录中的任何类型 重现步骤 如果您已经知道如何创建默认的 Webforms Web 应用程序并添加
  • 从以管理员身份运行的进程中以用户身份启动进程

    我想从以管理员身份运行的程序启动另一个以用户身份运行的程序 问题是第二个程序需要使用outlook 如果程序以管理员身份运行则不可能 主程序需要以管理员身份运行 我确实已经想出了这两个解决方案 Process Start cmd exe C
  • 通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

    我在通过电子邮件发送论点时遇到一些困难PendingIntent的通知使用NavDeepLinkBuilder 我能到达目的地Activity通过单击通知来启动 但是Activity s Intent不包含我通过它传递的参数值NavDeep