Deep linking 深度链接

来源:互联网 发布:php数组做分页 编辑:程序博客网 时间:2024/05/21 13:48

使用安卓或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代码:

<!DOCTYPE html><html>    <head>        <meta charset="{CHARSET}">        <title></title>    </head>    <body>    <a href="myapp://">打开我的app</a>    </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约定好链接的参数问题了