Deep linking 深度链接


使用安卓或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约定好链接的参数问题了