通过 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 发送参数 的相关文章

  • 如何使用 bash 脚本通过 tar 备份文件系统?

    我想备份我的 ubuntu 文件系统 我写了这个小脚本 这是非常基本的 但这是我第一次尝试 我害怕犯错误 由于需要几个小时才能完成才能看到结果 因此我认为最好向经验丰富的程序员询问我是否做错了什么 我特别感兴趣 gt 会记录输出mv或者它也
  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

    Premise 建议在CQRS DDD ES样式应用程序使用task基于屏幕 这些屏幕引导用户并捕获意图 These task屏幕也可以称为感应式用户界面 UI 设计指南的一些示例可以帮助您创建现代的 用户友好的应用程序 Microsoft
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • Hibernate Envers:如何捕获谁删除了审计表中的实体

    我在用hibernate envers with spring 一切工作正常 除了当我删除一个实体时 它不会改变的值updated by and updated date在审计表内 它会在之后保存一个与之前完全相同的实体 仅复制 sprin
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min
  • 在magento Attributes中添加自定义属性并显示在前端

    我已经开始使用 magento 作为我的电子商务 cms 我知道这是一个非常强大的平台 最近 我发现它的功能可以帮助开发人员扩展核心 并且我已经成功添加了自定义类别选项 是否有机会在某个属性上达到相同的结果 我想在属性选项卡上添加文本描述并
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图
  • Eclipse:如何增加查找/替换历史记录?

    查找 替换对话框显示最后 8 个条目 该对话框通过 Ctrl F 显示 我想增加 查找 和 替换为 输入字段的历史记录中显示的条目数 我必须搜索并替换几个字符串和正则表达式 因此我一次又一次地输入字符串和正则表达式 我并不是指文件内容更改的
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个
  • 在 MVC4 中使函数异步时 HttpContext.Current null

    我目前正在 VS2010 SP1 中开发 MVC4 我做了其中一个功能 控制器类异步 作为其中的一部分 我制作了控制器类 派生自 AsyncController 并添加了以下两个方法 参见代码部分 1 和 2 下 一种以 Async 结尾的
  • simple_fields_for 没有出现 [rails 4]

    我正在尝试创建两个隐藏字段 其中一个显示没有问题 但来自嵌套表单的另一个则没有 产品 rb class Product lt ActiveRecord Base has many product options dependent dest
  • jsf文件下载不起作用

    当我点击h commandButton它执行myBean dowanlod 方法 但它不下载任何文件 这是我在支持 bean 中的方法 没有例外 光标变得忙碌 似乎在等待响应 对于这种操作是否有任何额外的配置或者这段代码有什么问题吗
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • IOError:在 Linux 上的 ReportLab 中使用 matplotlib PNG 时“解码器 zip 不可用”,适用于 Windows

    我正在使用 ReportLab 打印 matplotlib 生成的图表 我可以在我的 Windows 开发机器上毫无问题地执行此操作 然而 当我部署到 Ubuntu 服务器时 渲染失败并出现所述错误 我假设我缺少一个 Python 模块 但

随机推荐

  • 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