微信号:guolin_blog

介绍:Android技术分享平台,在这里不仅可以学到各种Android相关的最新技术,还可以将你自己的技术总结分享给其他人,每周定期更新.

Android deep links技术实现

2016-05-10 07:52 郭霖

说好要写示例文章来给大家演示一下什么样的文章才比较适合在微信上发,那么本篇就是一个典型的标杆了。有朋友在群里问我,怎么样实现从网页中直接打开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)) {
               // 跳转到卖裙子界面            }        }    } }

本篇文章的内容就到这里, 是不是感觉简单易懂,而又可以学到东西?没有贴大量的代码,也没有长篇大论讲一个知识点,10分钟就能读完的精炼文章,这就是微信上最适合发的标杆技术文章了。那本篇文章也是一个比较典型的示例,希望所有有意向向我投稿的作者们可以参考一下, 不一定非要是多少高级的技术才可以拿来投稿的,你平时工作总结出的一些别人不知道的心得,也可以拿出来分享的。


至于我用来录制GIF图片的工具,我知道也会有很多朋友好奇,这里统一回答一下:Mac电脑上我使用的licecap,Window上我使用的GifCam,都是非常好用的工具,启用录制之后对模拟器进行操作就可以了。




如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

 
郭霖 更多文章 LitePal 1.2.0版本已发布 《见证Android推送时刻》视频系列教程已完结 喜大普奔,LitePal 1.3.0 版本发布! LitePal 1.3.1发布了,从此支持图片存储! 告别难记的长域名!我的博客全新短域名上线
猜您喜欢 IBM SaaS助力天合光能打造智慧团队 Android Bitmap占用内存分析 Docker——它是真正的未来 微信开源C\/C++ RPC框架PhxRPC Swarm中binpack策略引起的棘手问题