友荐云推荐

有朋友在群里问我,怎么样实现从网页中直接打开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,都是非常好用的工具,启用录制之后对模拟器进行操作就可以了。