Android:导航深度链接在 handleDeeplink()

如何解决Android:导航深度链接在 handleDeeplink()

我已经使用 Jetpack Navigation 在我的应用中实现了深度链接。我的应用程序遵循单一活动架构。片段之间的导航由导航图组织。

我发现了一个案例,其中两者 onCreateonNewIntent 回调都被调用。这不应该发生。让我解释一下用例:

  1. 用户从应用重定向到浏览器。
  2. 用户在浏览器中时,应用关闭(由操作系统或用户
  3. 用户通过深层链接重定向回应用。

上面用例的 Logcat 看起来是这样的(按正确的顺序):

  • 2021-05-13 09:01:53.261 onPause MainActivity@336e6f1 //重定向到浏览器
  • 2021-05-13 09:02:21.584 onDestroy MainActivity@336e6f1 //应用被用户或操作系统关闭
  • 2021-05-13 09:02:24.804 onCreate MainActivity@4a820dd //重定向回应用
  • 2021-05-13 09:02:24.940 onNewIntent MainActivity@4a820dd
  • 2021-05-13 09:02:24.979 onCreate MainActivity@349ea37
  • 2021-05-13 09:02:25.102 onResume MainActivity@349ea37
  • 2021-05-13 09:02:25.495 onDestroy MainActivity@4a820dd

因此应用程序一次创建 MainActivity 的两个实例,并在同一个实例中触发 onCreateonNewIntent 回调。

当应用关闭用户在浏览器中时,logcat 看起来像这样:

  • 2021-05-13 08:57:47.097 onPause MainActivity@7507cde
  • 2021-05-13 08:58:18.310 onNewIntent MainActivity@7507cde
  • 2021-05-13 08:58:18.312 onResume MainActivity@7507cde

singleTasksingleInstance 启动模式都没有改变任何东西。

我的问题是:

  1. 怎么可能同时调用 onCreateonNewIntent 回调?
  2. 为什么一次创建了两个 MainActivity 实例?
  3. 用户从应用导航回来,然后通过最近的应用打开应用时,会触发与上述 logcat 中相同的日志。为什么会这样?

我会非常感谢回答我问题的人。在这里添加我的代码

清单:

<activity
    android:name=".main.MainActivity"
    android:launchMode="singletop">

    <nav-graph android:value="@navigation/nav_graph" />

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

导航图:

<fragment
    android:id="@+id/paymentRedirectFragment"
    android:name="com.example.myapp.PaymentRedirectFragment">
    <action
        android:id="@+id/action_paymentRedirectFragment_to_transactionCompletionFragment"
        app:destination="@id/transactionCompletionFragment"
        app:popUpTo="@id/paymentRedirectFragment"
        app:popUpToInclusive="true" />
    <deepLink
        android:id="@+id/web_payment_deep_link"
        app:uri="com.example.myapp://foo/bar/this_is_just_example" />
</fragment>

主要活动:

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

override fun onCreate(savedInstanceState: Bundle?) {
    setTheme(R.style.AppTheme)
    super.onCreate(savedInstanceState)
    setSupportActionBar(toolbar)

    NavigationUI.setupWithNavController(
        binding.bottomNavigation,navController
    )
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    mavController.handleDeepLink(intent)
}

对浏览器的调用意图:

try {
    startActivity(Intent(Intent.ACTION_VIEW,Uri.parse(url)))
} catch (ex: ActivityNotFoundException) {
    showSnackBar(R.string.browser_not_found,binding.root)
}

解决方法

看起来这种行为是意料之中的。还有一个 issue 询问该行为是否有意。尚无答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?