您的位置:首页 > 移动开发 > Android开发

Android deep links技术实现

2016-05-13 21:02 239 查看
说好要写示例文章来给大家演示一下什么样的文章才比较适合在微信上发,那么本篇就是一个典型的标杆了。有朋友在群里问我,怎么样实现从网页中直接打开App的效果,这个问题实现起来并不复杂,但是却有很多人都不会,像这种文章就太适合在微信上发了。

实际上这种技术是个一个专业名词的,叫deep links,在Google Ads里面用的比较多。比如说你是一个购物的App,花钱在人家的网页上挂了个裙子的广告链接,那么当用户点击了这个广告链接,最理想的效果就是直接打开你的App的裙子界面,然后用户可能就会直接购买了。

怎么样实现这种效果呢?其实并不复杂,说白了就是利用Android的隐式Intent机制,对于隐式Intent如果还不了解的朋友请参考第一行代码第二章,讲的很透彻。

下面开始尝试实现deep links功能,首先我们来认识一下链接,对于链接大家肯定是再熟悉不过了,比如这样:
http://www.example.com/
其中http部分是协议,www.example.com部分是域名。那么根据我们平时上网的经验,域名部分一般都是各个网站的具体网址,而协议部分基本都是http,因为这是一个最广泛使用的协议。

而我们实现deep links功能其实也是借助这样的链接机制,但是我们不必拘泥于http协议,而是可以自定义任何的协议。

了解了这个概念之后就可以开始写一些具体的代码了,新建一个Android项目,然后打开AndroidManifest.xml文件,在MainActivity中添加如下内容:
<activity android:name=".MainActivity">
......
<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="com.example.androidtest"
/>
</intent-filter>
</activity>


对于熟悉隐式Intent的部分,这部分代码应该不难理解。这里我们新增了一个<intent-filter>标签,在里面加入了action,category和data三部分内容。其中action和category部分要固定写成这个样子,我们不能修改的,因为当你点击一个html链接时系统自动发出就是这样的action和category。

然后data部分就需要我们来自定义了,android:scheme用于指定协议,类似于http这样的东西,这里我们指定成了com.example.androidtest,这是一个自定义的协议,指定成这样是为了避免和其它的应用程序冲突,从而误把deep links链到人家的程序里去了。除了android:scheme之外,我们还可以通过android:host来指定域名,android:port来指定端口,android:path来指定路径,这些属性都可以对deep
links进行更多的限制,要满足特定条件才能打开指定App。那这里我希望只要是使用com.example.androidtest协议的链接就能打开我们的程序,因此就不对其他属性进行设置了。

现在将程序安装到手机上就可以了。

为了测试这个功能,我在本地搭建了一个服务器,然后在网页上放了这样一个链接:
<a href="com.example.androidtest://buydress">Try Deep Links</a>


也就是说,当点击了Try Deep Links这个链接时,会尝试跳转到com.example.androidtest://buydress这个界面,那么我们现在来试试吧,结果如下:



可以看到,deep links已经生效了。

那么有的朋友可能还会有疑问,这样只是打开了程序的MainActivity,如果真的像刚才介绍的一样,我想要直接打开购买裙子的界面该怎么办呢?总不能给每个Activity都设置一个deep link吧?确实没有必要,我们可以通过非常简单的界面跳转来实现这个功能。比如说上面的链接,除了scheme之外,还有一个叫做buydress的host,我们只需要在MainActivity中取出这个host,判断出来原来是你想买裙子的,然后跳转到裙子界面就可以了。具体代码如下:
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
if (intent != null) {
Uri uri = intent.getData();
String host = uri.getHost();
if ("buydress".equals(host)) {
// 跳转到卖裙子界面
}
}
}

}


原文地址:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235870&idx=1&sn=8499e45b52199e739d73ba7d2db2c21b&scene=23&srcid=0513jeeaA3Bg0a3WbnoF0WqV#rd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: