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的设计想法是跳转到应用内的,这个有点鸡肋。