Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有深度链接的Android导航组件: onNewIntent多次调用

带有深度链接的Android导航组件: onNewIntent多次调用
EN

Stack Overflow用户
提问于 2020-05-22 01:28:14
回答 5查看 7.2K关注 0票数 15

这一次,我需要您的帮助,在使用android导航组件与深度链接。

我一直在跟踪这个文档,片段和深度链接之间的连接工作得很好。

问题来自于接收深度链接的活动。在我的例子中,我设置了android:launchMode="singleTask“

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<activity android:name=".features.welcome.WelcomeActivity"
    android:launchMode="singleTask">
     <nav-graph android:value="@navigation/welcome_nav_graph" />
</activity>

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    Timber.d("onNewIntent: $intent with activity: $this")
    navController.handleDeepLink(intent)
}

通过这种配置,我注意到了一些奇怪的行为:

每次单击深度链接时,WelcomeActivity都会收到两次onNewIntent调用。甚至有时还创建了新的活动实例。喜欢

1_对象1-onNewIntent

2_对象1-onNewIntent

3_ object2-onCreate

这里有一些日志:

第一次发射 onCreate:意图{ flg=0x10000000 cmp={applicationId}/{package}.WelcomeActivity }具有活动:{package}.WelcomeActivity@4adbef0 开深链 onNewIntent: act=android.intent.action.VIEW {act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接)… flg=0x10010000 cmp={applicationId}/{package}.WelcomeActivity (已附加)}与活动:{package}.WelcomeActivity@4adbef0 onNewIntent:意图{ act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接}..。.具有活动的flg=0x1001c000 cmp={applicationId}/{package}.WelcomeActivity (有额外的)}:{applicationId}.WelcomeActivity@4adbef0 onCreate:意图{ act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接}..。.具有活动的flg=0x1001c000 cmp={applicationId}/{package}.WelcomeActivity (有额外的)}:{applicationId}.WelcomeActivity@b77c6b 关闭应用程序并打开深度链接 onCreate:意图{ act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接}..。.具有活动的flg=0x10018000 cmp={applicationId}/{package}.WelcomeActivity (有额外的)}:{applicationId}.WelcomeActivity@b78f4df onNewIntent:意图{ act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接}..。.具有活动的flg=0x1001c000 cmp={applicationId}/{package}.WelcomeActivity (有额外的)}:{applicationId}.WelcomeActivity@b78f4df onCreate:意图{ act=android.intent.action.VIEW cat=android.intent.category.BROWSABLE dat=链接}..。.flg=0x1001c000 cmp={applicationId}/{package}.WelcomeActivity (有附加)}和{package}.WelcomeActivity@dfe87b2

更新:

1 -It似乎与这个问题无关。我注意到默认启动模式也是如此。

2- navController.navigate(intent.dataString.toUri())似乎运行良好。所以我想问题是navController.handleDeepLink(意图)。

EN

回答 5

Stack Overflow用户

发布于 2020-08-06 23:00:48

onNewIntent上的回调第一次到达时,只需设置标志intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);并将突变的意图传递给handleDeepLink(intent);

此标志消除了onNewIntent回调的第二次到达,原因是重新连接到现有的Activity (完全重构到所需的深度链接目的地的后台跟踪),而不是启动新的Activity

详细信息在handleDeepLink方法的源代码中。

票数 12
EN

Stack Overflow用户

发布于 2020-05-22 05:42:59

通过测试不同的更改,我得出的结论是,“navController.handleDeepLink(意图)”是导致这种奇怪行为的原因。

这就是我试过的:

我从导航中删除了deepLink,深层链接正常工作(我手动添加了deepLink ):使用singleTask,如果活动已经创建,那么onNewIntent只会被调用一次。如果未创建活动,则调用onCreate。

这方面的另一个问题是,navController.handleDeepLink(意图)将在onCreate中自动调用(您可以在javadocs中检查它)。当调用onNewIntent时,您需要调用navController.handleDeepLink(意图)。

我决定尝试“导航(Uri deepLink)”从NavController,我看到这是正常工作(在第一段中描述的行为)。有了这个替代方法,我决定做一些修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WelcomeActivity : AppCompatActivity(){

      private val navController by lazy { findNavController(R.id.nav_host_fragment) }

      private var deepLinkData: Uri? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Timber.d("onCreate: $intent  with activity: $this")
        val data = intent.data
        intent.data = null
        setContentView(R.layout.activity_welcome)
        handleDeepLink(data)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        Timber.d("onNewIntent: $intent with activity: $this")
        setIntent(intent)
        val data = intent?.data
        handleDeepLink(data)
    }

    private fun handleDeepLink(uri: Uri?) {
        //TODO: there is an issue that will cause onNewIntent to be called twice when the activity is already present.
        if (uri != null && deepLinkData.toString() != uri.toString() && navController.graph.hasDeepLink(uri)) {
            //possible deep link for LoginFragment
            deepLinkData = uri
            navController.navigate(uri)
        }
    }

}

注意onCreate中的这个代码块是很重要的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val data = intent.data
intent.data = null

这样做的原因是,如果我需要阻止“navController.handleDeepLink(意图)”被调用,因为如果存在该信息,就会自动调用它,从而导致这种奇怪的行为。

navController.graph.hasDeepLink( uri )将帮助您查看您的图形是否能够处理那个uri。如果您不使用它,那么“导航(Uri deepLink)”将引发异常。

如果你遇到同样的问题,希望它能帮助你。如果你对此有更多的见解,请留下一些评论。

票数 10
EN

Stack Overflow用户

发布于 2020-07-27 03:52:53

当单击隐式深度链接时,就会有意图地设置FLAG_ACTIVITY_NEW_TASK。并且,根据文档,将重新创建后台,使其处于良好状态。请参阅这里的文档隐式深链

如果您不想要这种行为,并且不想更改意图标志,您可以自己处理深度链接,而不是将它传递给导航组件。因此,如果您使用的是AdvancedNavigationSample,您需要删除handledeeplink并按照方向使用findNavController().navigate()

另外,请记住将launcher活动的启动模式设置为singleTask,以便在单击“深度链接”或“通知”时接收新的意图。

  1. 将示例中的NavController.handledeeplink()替换为
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun BottomNavigationView.navigateDeeplink(
    navGraphIds: List<Int>,
    fragmentManager: FragmentManager,
    containerId: Int,
    uri: Uri
) {
    navGraphIds.forEachIndexed { index, navGraphId ->
        val fragmentTag = getFragmentTag(index)

        // Find or create the Navigation host fragment
        val navHostFragment = obtainNavHostFragment(
            fragmentManager,
            fragmentTag,
            navGraphId,
            containerId
        )
        // Handle deeplink
        val canHandleDeeplink = navHostFragment.navController.graph.hasDeepLink(uri)

        if (canHandleDeeplink) {
            if (selectedItemId != navHostFragment.navController.graph.id) {
                selectedItemId = navHostFragment.navController.graph.id
            }
            navHostFragment.lifecycleScope.launchWhenResumed {
                // Wait for fragment to restore state from backStack
                // otherwise navigate will be ignored
                // Ignoring navigate() call: FragmentManager has already saved its state
                navHostFragment.navController.navigateOnce(uri)
            }
        }
    }
}
  1. intent.data存储在变量中,并将其设置为null,这样导航组件就无法处理它。在onHandleNewIntent中也做同样的事情
  2. 将此深度链接传递给底部导航以处理。如果应用程序已经在运行,您可以使用上面的函数直接导航到目的地。

完整的解决方案是在这个示例上实现的。

优点:

  1. 您可以以相同的方式直接处理通知单击。从操作中创建一个深度链接,并在intent.data中PendingIntent中传递它。
  2. 您可以根据需要验证和更改深度链接。就像用户没有被记录一样,它直接进入登录活动,或者移到指定的目的地。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61951850

复制
相关文章
学习|Android JepPack组件---导航Navigation
本来做这个是因为公司的内部需要一个扫描的小程序,开始想就是全部重新用JetPack组件做,不过想到了后台产品中有一个可以应用到现在的使用场景,于是花了一天时间修改了一下那个程序就可以直接用了,所以这篇文章就做为学习的Android的组件了。
Vaccae
2020/04/27
9020
点击网页链接调用Android程序
最近前端同事问了我一个问题,如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏览,你需要做的是让市面上的浏览器支持才行。
技术小黑屋
2018/09/04
2.3K0
Android Jetpack 导航组件 | Android 中文教学视频
应用内导航,也就是我们通常所说屏幕切换,一直是 Android 开发很关键的一部分。我们已正式发布稳定版 Android Jetpack 导航组件,它包含丰富的库、工具和指南,为开发者们提供了一个强劲、完整的导航框架,让开发者可以轻松应对复杂的导航场景。我们在这个视频中通过一些导航组件的应用实例,向您演示如何通过 "单个 activity 嵌套多个 fragment" 的方法来完成导航工作。
Android 开发者
2022/09/20
9010
Android Jetpack 导航组件 | Android 中文教学视频
如何在Android中优雅的分发深度链接
DeepLinkDispatch提供了一种声明式的, 基于注解的API, 用于定义应用深度链接.本文是TonnyL创作的文章,希望可以支持下原作者的博客。如果你想学习,找不到好的途径,学习提高技术的方法,提高面试技术等都可以公众号后台咨询,关注本留言。
开发者技术前线
2020/11/23
2.1K0
如何在Android中优雅的分发深度链接
CompoundButton调用setChecked多次触发onCheckedChanged
当我们只想改变CompoundButton的状态时,setChecked会出现onCheckedChanged的情况。
全栈程序员站长
2022/08/15
1.1K0
Chrome插件:(NoFollow)自动标出带有nofollow的a链接
声明:本文由w3h5原创,转载请注明出处:《Chrome插件:(NoFollow)自动标出带有nofollow的a链接》 https://www.w3h5.com/post/214.html
德顺
2019/11/13
6690
Chrome插件:(NoFollow)自动标出带有nofollow的a链接
android组件调用onMeasure时报空指针
android.view.View.measure(int widthMeasureSpec, int heightMeasureSpec) 这个函数时,如果这个View是通过LayoutInflater来构建的,会报: java.lang.NullPointerException at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:529) at android.view.View.measure(View.ja
程思扬
2022/01/10
3310
android 防止多次点击
大家在开发过程中写控件点击事件是经常有的事,有时候用户操作过快会导致点击多次,影响体验,我们该如何避免这种情况呢,很简单加个方法判断下就好了 ,主要是利用了时间差的原理。
再见孙悟空_
2023/02/10
1K0
singletask和onNewintent
当activity属性设置为singletask时,如果按home键,然后重新启动该activity,理应走到onNewIntent()中去,但是在搞music时发现并非如此,
全栈程序员站长
2022/09/13
7200
Android系统源码剖析(一)---Settings
本文为博主辛苦总结,针对Android4.42源码分析,转载请注明出处,http://blog.csdn.net/zrf1335348191/article/details/50837027
fanfan
2022/05/07
2.3K0
Android系统源码剖析(一)---Settings
使用导航组件: 条件导航 | MAD Skills
这是第二个关于导航 (Navigation) 的 MAD Skills 系列,本文是导航组件系列的第二篇文章,如果您想回顾过去发布的内容,请参考下面链接查看:
Android 开发者
2022/03/09
1.6K0
使用导航组件: 条件导航 | MAD Skills
(十八)组件导航守卫
这里指的导航守卫,是在 router.js 里面配置了的路由组件,其他不同组件配置不了
老怪兽
2023/02/22
2410
Android连续点击多次事件的实现
System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。
用户1289394
2021/07/30
1.3K0
前端|Bootstrap——导航组件
Bootstrap是一个用于快速开发Web 应用程序和网站的前端框架,它提供了一个带有网格系统、链接样式、背景的基本结构。Bootstrap提供了许多的组件,其中就包括导航组件。这在很大程度上简化了操作。通常都是利用列表实现来导航的,常用的是无序列表(<ul>)和有序列表(<ol>)。自定义列表(<dl>)一般不会用来实现导航。
算法与编程之美
2020/03/25
6.7K0
使用深层链接导航 | MAD Skills
这是一个新的系列文章,我们称之为 "Modern Android Development 技巧",简称为 "MAD Skills"。本系列文章致力于帮助开发者们打造更好的现代 Android 开发体验,敬请关注。
Android 开发者
2022/03/09
5690
使用深层链接导航 | MAD Skills
Android 进阶2:Activity 的 Task 与启动模式
本文主要介绍了在 Android 开发中,关于 Activity 的 Task 和启动模式的简单探讨。首先介绍了什么是 Task,以及 Task 与 Activity 之间的关系。之后通过代码示例讲解了如何定义和启动 Task,以及如何使用 Intent 切换 Task。最后介绍了四种 Task 的启动模式,并给出了相应的示例代码。", "key": "android_task_and_start_mode
张拭心 shixinzhang
2018/01/05
1.6K0
Android 进阶2:Activity 的 Task 与启动模式
java多次调用,最后一次调用后才执行
前段时间写了java防抖,不过之前写的都是在一定时间内只执行一次,超过这个时间,防抖又失效了,假设我现在有这样一个需求:
阿超
2022/08/16
1.4K0
java多次调用,最后一次调用后才执行
ASP.NET的导航链接问题求助
在VS2008里面开发完全正常,但是在IIS5.1里面默认网站里面新增一个虚拟目录的制定到这个网页里面的话在浏览器里面http://localhost/查看就是可以显示,但是里面的链接全部不正常。 举例:虚拟目录的名称为meng,那么我们要访问我们的网站就要这样:http://localhost/meng/Default.aspx 这样首页是出来了,但是里面的链接都不是以http://localhost/meng/开头,而是以http://localhost/开头!!也就是说我网站目录里面有一个Gu
SAP梦心
2022/05/10
1.4K0
点击加载更多

相似问题

带有导航组件的Android深度链接未按预期工作

11

Android导航组件深度链接背靠背

10

基于Android导航组件的深度链接与动画

12

使用Serializable作为Android导航组件的深度链接参数

132

在onNewIntent()中多次调用onResume()

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文