使用安卓或ios软件的过程中经常碰到这样一种情况:当我在浏览器打开一个页面时,时常会自动打开相对应的app,并进入相应的app页面中,这就用到一项技术-Deep Linking,下面就来介绍一下如何在自己的android APP中使用这项技术。
1。假设已经有了一个app项目,我们需要在项目中新建一个Activity。我们暂且取名为ViewActivity,在AndroidManifest.xml文件中的ViewActivity标签中添加Intent-filter:
<activity android:name=".activity.ViewActivity">
<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:scheme="myapp"/>
intent-filter>
activity>
2。此时在网页中就可调用这个地址就可以打开我们的app,下面是我写的一个测试deep linking的html代码:
<html>
<head>
<meta charset="{CHARSET}">
<title>title>
head>
<body>
<a href="myapp://">打开我的appa>
body>
html>
在手机上打开这个网页,点击链接“打开我的app”就可以自动打开我们的app了,并且能自动进入ViewActivity这个页面中。其实并不是只有myapp://这个链接可以进入我们的app,只要开头为myapp://的链接都可以自动进入我们的app。
3.但是我们的要求不是自动进入app的ViewActivity页面,我们的ViewActivity只是作为一个处理deep linking 的一个过渡页面。总不能在每个页面都要写这么一套代码吧,当然不能,下面我就来介绍如何根据schema内容来引导app进入页面
1).在ViewActivity中取出我们的URI值。在此顺带讲解一下URI值中的各个属性,可能有些代码在我们这个测试项目中用不到,只是作为demo讲解一下(我的项目使用kotlin写的,暂时就用kotlin给大家讲解了,我相信懂java的应该都能看懂kotlin)
val uri = intent.data//链接地址
val host = uri.host//域名
var query=uri.query//获取参数列表
var params = query.toString().split("&")
var bundle=Bundle()//bundle容器,用来保存传递链接问号后带的参数
if(null!=params){
for (key_value in params) {
bundle.putString(key_value.split("=")[0],key_value.split("=")[1])
}
}
intent.putExtras(bundle)
var pageName=uri.getHost()//这就是我们链接中传递过来的页面名字,因为很多情况下需要统一android与IOS的页面跳转,所以这个名字并不是我们严格意义上的项目中的页面名,而是我们私下里商量好的那个字符串对应哪个页面
when(pageName){
"page1" ->{
intent.setClass(this,Page1::class.java)
startActivity(intent)
}
"page2" ->{
intent.setClass(this.Page2::class.java)
startActivity(intent)
}
}
finish()
大功告成,至此我们的deep link基础就讲解完了,app此时就可以根据事先的约定根据链接打开并跳转到相应的app了,并且携带了链接后带的参数传到相应的Activity中,下面要做的就是你与html约定好链接的参数问题了