Android DeepLink 框架 - DeepLinkDispatch 源码浅析

1,775 阅读3分钟

DeepLink,该网址可能需翻墙。最常见的应用就是在网页中跳转到App的某个页面,电商类应用可是都用了的。用法如下:来自文档

这里写图片描述
我们通过如下代码获取data信息。

 Intent intent = getIntent();
 String action = intent.getAction();
 Uri data = intent.getData();

额,这里就不在介绍了,同志们看文档去。

DeepLinkDispatch是一个负责deeplink dispatch的框架,为什么需要dispatch呢,因为需要根据data跳转不同的页面,嗯哈。DeepLinkDispatch github地址(airbnb出的) 这个框架是以注解的形式来配置的。还是简单的来说下用法吧。[readme.md]

  • @Deep 注解支持 Activity和Method。
  • foo://example.com/methodDeepLink/{param}?key=value
    • 这里的param,value,均可通过bundle获取

在配置文件中添加
这里写图片描述
我们的关键不是用法,感兴趣的同学去看下吧。

3. 生成class文件过程

编译时注解生成,和Butterknife一样,使用,javapoet和AutoService简化操作。

  • javapoet 简化类的生成
  • AutoService 简化注解器注册

4. 开启分析之路

最后生成的class文件如下:

这里写图片描述

DeepLinkActivity中使用DeeplinkDelegate这个代理去处理我们的Uri,代码在dispatchFrom方法中,代码较长,我们分段来搞。
这里写图片描述

  • 首先,根据android文档中的代码获取Uri
  • DeepLinkLoader#load
    • 这个是干什么的呢?我们看一下这个类就明白了。
      这里写图片描述 原来是将我们所有注解了的方法,封装成DeepLinkEntry这个类的构造方法有下面几个参数
      • url
      • 注解类型,是注解的class(Activity)还是方法
      • 哪个类的
      • 如果是注解的方法,方法名是什么
  • 解析出当前URL对应哪一个DeepLinkEntry

5.解析Uri{xx}和key=value

对应的代码还在dispatchFrom中,代码如下:
这里写图片描述

  • DeepLinkUri#getParameters 解析{}
  • DeepLinkUri#queryParameterNames 解析?后的key value,query参数

这里写图片描述

  • parameters 是在初始化DeepLinkEntry的时候,初始化的,调用了该类的parseParameters方法

这里写图片描述

这里就是取出host和path中的{xxx}的,注意这里得到的相当于key,这里得到的相当于key回到上面的哪个方法,做一层保护,然后在解析inputUrl,这个url,是将{}替换成具体值的,这样就到到一个map,就是{xxx},xxx为key,真正输入进来的内容为value,的map。

实际上呢,DeepLinkUri就是OkHttp中的HttpUri这个类,就用来对Uri进行解析的。这个queryParameterNames方法就是得到Uri中的query参数,也就是?之后的键值对,这里就不在多说了。有兴趣的去看下代码。

到这里呢?就把真实的Uri解析成对应与我们的注解,并且{},?key=value都解析成对应的map了。接下来就是真正分发的逻辑啦。

6.真实的分发逻辑

截图看下,分发的相关代码。
这里写图片描述
这里写图片描述

  • 首先生成Intent对象
    • 如果entry的类型是class,就正常的intent
    • 如果是method,就反射对应的class的method方法
  • setAction 和data,数据来自于sourceIntent,也就是最开始,android文档的那种,这样,分发下去也能获取到这些信息了
  • 处理Bundle
    • sourceIntent原有的
    • 对应注解中的{}和query的key value
  • 如果有CallingActivity ,调用这个的activity
    • 设置Flag为33554432,对应的16进制为0x20000000,也就是FLAG_RECEIVER_REPLACE_PENDING,这个flag,与receiver相关。
  • startActivity
  • createResultAndNotify 创建返回结果并发送广播

到这里,就简答的分析完了。

7. 总结

  • deeplink 普及不广,但很有用
  • DeepLinkDispatch
    • DeepLinkDelegate 代理类,核心之一,负责分发
    • DeepLinkEntry deeplink实体类,
    • DeepLinkLoader deeplink实体注册查找类
    • 其他
  • DeepLinkDispatch 缺陷
    • 可以注解方法,但个人感觉实际用处,因为他必须返回Intent。并且,google的设计想法是跳转到应用内的,这个有点鸡肋。