基于 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对应的节点后,其中 id 、name、label 三项在此中,都需要自行根据项目现状和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值(如有)
注意事项
navArgument
的 nullable 为 true 而没有对应参数时,程序将报错navDeepLink
的 uriPattern 应为经过url编码后的字符串- 如使用
&
参数拼接,那应把&
转换填写为%26
- 如使用