1

我想使用导航组件创建一个隐式深层链接。

但是当我使用以下 URL 启动我的应用程序时:

https://my-app.com/cars/ef123-aaf33/parts

我收到以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{myapp/screens.car.CarActivity}: java.lang.IllegalStateException: 

Activity screens.car.CarActivity@3b8d354 has null extras in Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://my-app.com/... flg=0x13008000 cmp=myapp/screens.car.CarActivity }

Intent 没有任何额外内容,但它应该包含carUuid在深度链接中定义为 URL 占位符。navArgs()评估后立即引发错误。

这是我的设置:

nav_graph.xml

<fragment
    android:id="@+id/fragment_parts"
    android:name="myapp.screens.parts.PartsFragment"
    android:label="@string/parts"
    tools:layout="@layout/fragment_parts">
    <deepLink
        android:id="@+id/deepLink"
        app:uri="my-app.com/cars/{carUuid}/parts" />
    <argument
        android:name="carUuid"
        app:argType="string" />
</fragment>

AndroidManifest

<activity android:name=".screens.car.CarActivity" >
    <nav-graph android:value="@navigation/nav_graph" />
</activity>

汽车活动

class CarActivity : AppCompatActivity() {


    private val carViewModel: CarViewModel by viewModel { parametersOf(args.carUuid) }

    private val args: CarActivityArgs by navArgs()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        DataBindingUtil.setContentView<ActivityCarBinding>(this, R.layout.activity_car).also { binding ->
        binding.lifecycleOwner = this
        binding.carViewModel = carViewModel
    }

}

有用的链接:

隐式 DeepLink 的 Android 文档

RayWenderlich 在 DeepLinks 上

- - 更新 - -

我创建了一个最小的示例项目,并找到了关于发生/出错的提示。我在官方问题跟踪器上发布了所有内容: https ://issuetracker.google.com/issues/155690730

4

2 回答 2

2

我从导航团队那里得到了答案,以及对我的情况来说足够好的解决方案/解决方法。可以在此处找到包括示例项目在内的更多详细信息

https://issuetracker.google.com/issues/155690730

为什么会发生这种情况(来自 Google 问题跟踪器的回答)

转到内部的深度链接目标SubActivity绝对是可能的,但当时handleDeepLink()我们还没有构建NavDeepLink能够识别深度链接变量的对象。此外,如果我们能够以某种方式解析 URL 模式并将其作为额外的意图,例如您给出的示例,则 by navArgs()call inSubActivity将返回一个值“alice”,这意味着深层链接目标,而不是这是活动。

当您使用 NavDirections 调用 navigate() 时,在 Activity 中起作用的原因by navArgs()是 ActivityNavigator 将额外内容添加到用于启动新 Activity 的 Intent 中。当您使用来自 adb 的深层链接时,您会绕过所有这些逻辑,这意味着启动活动的意图没有额外内容,这就是它应该失败的原因。

无论您的用例是什么,都可能有比嵌套活动更好的方法。话虽如此,您可以通过在用于从深层链接启动应用程序的 adb 命令中添加一个带有键名的额外项来完成这项工作:--es "name" <"your string">。

我现在应该做什么

由于我可以完全控制深层链接 URL,我现在要做的是将深层链接设置为 SubActivity 本身。此外,我还为深度链接 URL 提供了目标 SubActivity 应设置为 startDestination 的信息。

这种方法对我来说很好。唯一的缺点是MainActivity也是在backstack中构造的,这样用户在按下返回键的时候首先会被带回到这个MainActivty。但我可以忍受:)

于 2020-05-19T20:50:31.070 回答
0

在你的 deepLink 中试试这个:

<fragment
    android:id="@+id/fragment_parts"
    android:name="myapp.screens.parts.PartsFragment"
    android:label="@string/parts"
    tools:layout="@layout/fragment_parts">
    <argument
        android:name="carUuid"
        app:argType="string" />
    <deepLink
        android:id="@+id/deepLink"
        app:uri="my-app.com/cars/{carUuid}/parts" >
    </deepLink>
</fragment>
于 2020-05-08T20:16:33.047 回答