深链接即我们通常说的scheme跳转,需要我们在清单文件中对activity添加intent-fillter,并定义scheme(包括但不限于HTTP协议)。如果用户手机内安装了多款能响应链接启动的应用,那么系统会弹出一个选择器,让用户自主选择用哪个应用打开。
Android App Links是6.0以后才支持的链接方式,APP通过定义一组你自有的HTTP URL将该其设置为系统的默认打开对应域名的地址的应用(注意区分:不是6.0以下的默认打开某类数据)。当用户点击了包含你的域名的链接时,系统默认用你的APP打开该链接,如果用户手机未安装你的APP,那么会直接用浏览器打开。手机里的其他应用则不能打开。
其实是一种技术的两种使用方式而已
区别项 | Deep link | App Links |
---|---|---|
Intent URL scheme | http,https,自定义协议 | http,https |
Intent action | 任何action | 需要android.intent.action.VIEW |
Intent category | 任何category | 需要android.intent.category.BROWSABLE和android.intent.category.DEFAULT |
链接验证 | 不验证 | 通过DAL文件和https验证 |
用户体验 | 可能会弹出一个APP选择弹框让用户选择用哪个应用打开 | 不弹APP选择弹框,直接用你的APP打开(已安装,否则直接打开网页) |
兼容性 | 所有版本系统 | 6.0及以上 |
代码上的区别
因此,Android App Links相对于Deep link有以下几点优势:
1、安全:因为只有你自己的APP能打开,所以很可靠;
2、无缝的用户体验:因为只有自己的APP可以打开,所以不会出现让用户选择哪个应用的打开的弹框,如果用户没有安装你的APP,则直接用浏览器打开。
3、支持免安装的谷歌应用:当然,这条优势对国内开发者来说没什么影响,因为谷歌的免安装应用需要上传到google player。
4、支持从浏览器、谷歌搜索APP、手机快捷搜索和谷歌助手等多个地方通过链接启动APP。
但是,因为国内room厂商众多,如果在浏览器中打开链接,因为各方浏览器不一致,类似这种功能被限制了,往往会跳转新的网页,致使不能唤起APP。
Deep link支持:
当用户点击一个链接时,系统默认按以下顺序打开:
1、如果你设置了默认打开应用,则优先使用该应用打开;
2、如果只有一个应用能打开,则直接用该应用打开;
3、如果有多个应用能打开,才会弹出应用选择弹框。
AndroidManifest.xml
<activity
android:name=".MainActivity"
android:exported="true"
android:label="活动中心"
android:theme="@style/Theme.AppLinksDemo">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="app.niceloo.com"
android:pathPrefix="/app/activityCenter"
android:scheme="youlu" />
</intent-filter>
</activity>
MainActivity.kt
因为页面可能第一次开启,也可能是在后台存活,故也需要在onNewIntent方法中进行判断是否有数据
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, false)
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
parseIntent()
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
parseIntent()
}
private fun parseIntent() {
val appLinkAction = intent.action
val appLinkData = intent.data
//如果没有deep link信息,这里为空
appLinkData?.let {
val authority = appLinkData.authority
val path = appLinkData.path
val query = appLinkData.query
binding.textviewFirst.text = "linkData:${appLinkData.toString()}"
}
}
}
binding.textviewFirst.setOnClickListener {
val intent=Intent(Intent.ACTION_VIEW)
intent.data= Uri.parse("youlu://app.niceloo.com/app/activityCenter?activityId=123456")
startActivity(intent);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>App link</title>
</head>
<body>
<a href="youlu://app.niceloo.com/app/activityCenter?activityId=123456" style><font size="20">跳转打开活动中心123456</font></a>
</body>
</html>
scheme是协议信息,当前demo中为youlu
authority是域名信息
path是路径信息,可选值
query是连接中的参数信息