Android路由跳转-基础

实际开发需求

目前工程中的路由跳转主要功能:根据H5或Native中所包含的Url跳转至相应的Native页面。涉及到三个环节:

  1. Url解析
    解析Url相应的Scheme/Host/Path/QueryParam

  2. Url与Native页匹配
    将页面匹配URL的规则存入HashMap进行映射。
    如果映射成功,找到与页面对应的Intent,给Intent增加Url/Extra信息等。

  3. 跳转至Native或H5页
    将匹配得到的Intent进行跳转。
    startActivity(WithParams) / startWebViewActivity

URL Scheme协议

为应对如下的跨应用页面调用,具备安全、低耦合、灵活的特性,Android可自定义Url Scheme协议。

  • 应用场景

1.服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
2.H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
3.APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
4.APP根据URL跳转到另外一个APP指定页面

  • 协议格式
    一个完整的完整的URL Scheme协议格式由scheme、host、port、path和query组成。其中<host>:<port>称为authority。其结构如下所示:

<scheme>://<host>:<port>/<path>?<query>

  • URL中的依赖关系
    如果没有指定scheme,那么host参数会被忽略
    如果没有指定host,那么port参数会被忽略
    如果scheme和host都没有指定,path参数会被忽略

  • 应用
    使用URL跳转Activity属于隐式启动,可在AndroidManifest/代码/Js中使用URL跳转。

URL/URI/URN的关系

URI:Uniform Resource Identifier,统一资源标识符。

URL:Uniform Resource Locator,统一资源定位符,见以下示例:

http://example.com/mypage.html
ftp://example.com/download.zip
mailto:user@example.com
file:///home/user/file.txt
tel:1-888-555-5555
http://example.com/resource?foo=bar#fragment
/other/link.html (A relative URL, only useful in the context of another URL)

URN:Uniform Resource Name,统一资源名称。用一个独一无二的永久存在的名称来定义一个资源,但是该名称不需要表明该资源所在位置。通常有urn:前缀。

关系图

参考

自定义注解

  1. 注解
    注解是一种元数据, 可以添加到java代码中. 类、方法、变量、参数、包都可以被注解,注解对注解的代码没有直接影响.
    定义注解用的关键字是@interface

  2. 元注解
    元注解就是用来定义注解的注解.其作用就是定义注解的作用范围,使用在什么元素上等等.元注解共有四种@Retention, @Target, @Inherited, @Documented

  3. 运行时获取注解
    使用反射的Field.getAnnotation()方法

  4. 编译时注解(APT:Annotation Processing Tool)
    使用AbstractProcessor方法获取所有Anntation的Set集合,可创建编译时生成的JavaFileObjectJava文件对Annotation对象进行处理。
    Dagger,ButterKnife等框架使用此技术。参考

  1. roundEnvironment.getElementsAnnotatedWith(RouteAnnotation.class)拿到所有RouteAnnotation注解标注的类
  1. 循环取出注解的name属性和被标注的类名并缓存;
  2. 通过javapoet库生成Java类,javapoet是square公司出品,可脱离手动凭借字符串来生成Java类的痛苦,可以通过各种姿势来生成Java类。
  3. 最后通过JavaFile.builder("包名",TypeSpec)生成Java文件,包名可以随意取,最后生成的文件都是在主程序模块app.build.generated.source.apt目录下
    参考

SPI(Service Provider Interface)

为某个接口寻找服务的机制,可实现不同模块之间的面向接口编程,类似IOC,将装配的控制权交给ServiceLoader.
以下为具体步骤:

  1. 不同模块基于同一接口编写具体的实现类service provider
  2. 通过SPI机制自动注册到配置文件中:为每个模块添加配置文件META-INF/services/BaseServiceInterface
  3. 运行时扫描加载同一接口的不同service provider,可进行动态插拔:
  • 获取当前线程的类加载器Thread.currentThread().getContextClassLoader();
  • 以懒加载的形式,当需要获取具体service provider时,构造Iterator
  • 通过类加载器遍历不同模块的具体实现类,并构造该实例。
    参考

ARouter

Android路由跳转-ARouter框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,805评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,286评论 19 139
  • 三十岁的第一天,做实验做实验做实验。是你课题的实验吗?不是。你课题有实验吗?没有。 申公派的时候用的课题到这来发现...
    TheOriginalElf阅读 195评论 0 0
  • 天空一片晴好,看着一儿一女在游乐场愉快的玩耍,我在一旁眯着眼,晒着这初春的太阳,原来世界是这般美好,生活可以这...
    麒麟妈妈111阅读 149评论 0 0
  • 我深深地明了 你已将云层铺展 为世间抛洒下你 如泣如诉,亦如饮的琴韵 大雨 看不见夜晚生烟的乡村 飞溅出瓦盏的秋水...
    淑文许阅读 213评论 5 4