基于 Compose Navigation 实现 DeepL

前言

这是21年12月的文档,所以可能一些api存在变动,但思路是相通的。

什么是DeepLink

简述

  • DeepLink是一个可通往APP中指定页面的一个网络链接
  • 该链接可以出现在任何可出现富文本的地方。如:
    • 浏览器链接
    • 某APP中可点击的链接
    • 通知栏的一条通知

功能

某APP注册DeepLink后,点击DeepLink即可带参数跳转到该APP指定的页面中。

实现DeepLink

引用依赖

因为本文是实现一个基于compose的navigation,所以除了基础和必备的jetpack compose相关依赖之外,还需要额外引入navigation的compose版本。

(无需再引用传统版本navigation)

清单文件中声明

	//compose-navigation
	implementation "androidx.navigation:navigation-compose:2.4.0-beta02"

compose代码必定运行在某Activity之上,所以在AndroidManifest中 、该Activity之下,增加对应的<nav-graph/>项即可。 如下——

<activity
    android:name=".RallyActivity"
    android:windowSoftInputMode="adjustResize"
    android:label="@string/app_name"
    android:exported="true">
    <nav-graph android:value="@navigation/mobile_navigation" />
</activity>

创建对应的 navigation 目录 和 nav-graph 指向的文件

声明时对应的navigation资源目录和mobile_navigation文件还未创建,我们自然需要创建一个。

填写nav-graph文件内容

示例如下——

<?xml version="1.0" encoding="utf-8"?>
<activity android:id="@+id/deeplink_dest"
    android:name="com.example.compose.rally.RallyActivity"
    android:label="@string/app_name"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <deepLink app:uri="test.cn/.*" />
</activity>

指定DeepLink

在Activity节点下新增"deepLink"项,指定Activity需要响应的uri即可。

可以用通配符 .* 配合表示需要匹配的链接。

  • 此uri应当是 activity 中代码设定的可响应的DeepLink链接类型的超集
  • 此uri可忽略 http://https:// 前缀

其他项

在xml中创建Activity对应的节点后,其中 idnamelabel 三项在此中,都需要自行根据项目现状和Activity填写。

其他xmlns指定的命名空间属于固定项。

为navigation项增加DeepLink

示例 navHost 如下——

navHost ( ... ) {
        composable( routeName , listOf( navArgument , ... ) , listOf( navDeepLink , ... ) ){ entry->
                //composable content
        }
    }

其中,navArgument 声明了此 composable 可接受的 全部参数,示例如下——

navArgument ( "name" ) {
        type = NavType.StringType
        nullable = false 
}

其中,navDeepLink 声明了此 composable 可接受的 DeepLink,示例如下——

navDeepLink {
        uriPattern = "test.cn/name={name}"
}

然后,在composable content中,即可通过 entry.arguments?.getString( "name" ),获取到传入的name值(如有)

注意事项

  • navArgumentnullabletrue 而没有对应参数时,程序将报错
  • navDeepLinkuriPattern 应为经过url编码后的字符串
    • 如使用 & 参数拼接,那应把 & 转换填写为 %26
全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
重生2012之我是java程序员:换个稍微正式点的照片吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务