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组成。其中:称为authority。其结构如下所示:

://:/?

  • 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:[email protected]
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:前缀。

Android路由跳转-基础_第1张图片
关系图

参考

自定义注解

  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路由跳转-基础)