美文网首页
组件化框架原理简析

组件化框架原理简析

作者: 浪里_个郎 | 来源:发表于2020-04-28 14:25 被阅读0次

1,大伙熟悉的ARoute有以下功能

可以让两个模块在不耦合的情况下,实现:
1)Activity跳转
2)接口实例跨模块传递
3)通过url指定特定的Activity跳转
4)通过拦截器,对各种操作进行拦截处理
在执行上面操作时,还有回调来监听过程结果。

2,分析路由框架的实现原理

路由框架使用流程

用图表示的话,初始化阶段是可提供路由的元素向路由模块注册:


向路由注册,信息放入Map

然后就可以通过字符串进行路由跳转了:


路由跳转

3,代码自动生成原理

使用Annotation Processing Tool实现,即编译时注解技术(APT)。

首先实现自定义注解,需要以下几步:

1,定义自己的注解接口名称,并指定元注解(标识注解属性的注解)ElementType和RetentionPolicy中的值:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Route {
    String path();
}

2,编写注解解释器。同样需要指定元注解

/**
  动态加载注解解释器,以实现注解处理器的自动注册(不需要手动调用注册)
@AutoService(Processor.class)
/**
  处理器接收的参数 替代 {@link AbstractProcessor#getSupportedOptions()} 函数
 */
@SupportedOptions("moduleName")
/**
 * 指定使用的Java版本 替代 {@link AbstractProcessor#getSupportedSourceVersion()} 函数
 */
@SupportedSourceVersion(SourceVersion.RELEASE_7)
/**
 * 注册给哪些注解的  替代 {@link AbstractProcessor#getSupportedAnnotationTypes()} 函数
 */
@SupportedAnnotationTypes("com.xsm.easy.annotation.Route")
public class RouterProcessor extends AbstractProcessor {
    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
    //该方法主要用于一些初始化的操作
    //通过该方法的参数ProcessingEnvironment可以获取一些列有用的工具类
    }
    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
    //获取同一个类中的所有指定注解修饰的参数值
    //创建Java文件
    }
}

3,引入依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.google.auto.service:auto-service:1.0-rc2'
    annotationProcessor 'com.google.auto.service:auto-service:1.0-rc2'
    implementation 'com.squareup:javapoet:1.7.0'
}

squareup:javapoet是用来生成java文件的一个库。具体使用可以查询javapoet语法介绍。编译后生成的java文件会存放在build\generated\source\apt中。
使用时,我们在需要路由的元素上加上注解,如:

@Route(path = "/main/main")
public class MainActivity extends AppCompatActivity {

路由管理类的作用

配置完了注解,我们就可以在RouterProcessor中,获取添加了注解的元素的信息,将这些信息在应用初始化时,放入自动生成的路由管理类:

//该类是通过javapoet自动生成的
public class EaseRouter_Group_main implements IRouteGroup {
  @Override
  public void loadInto(Map<String, RouteMeta> atlas) {
    atlas.put("/main/main",RouteMeta.build(RouteMeta.Type.ACTIVITY,MainActivity.class,"/main/main","main"));
    atlas.put("/main/main2",RouteMeta.build(RouteMeta.Type.ACTIVITY,Main2Activity.class,"/main/main2","main"));
  }
}

代码中可以通过路由进行跳转:

EasyRouter.getsInstance().build("/module2/module2main").navigation(this, new NavigationCallback() {
    //回调
    ...
}

最终是在路由模块中执行startActivity。

相关文章

网友评论

      本文标题:组件化框架原理简析

      本文链接:https://www.haomeiwen.com/subject/zlxewhtx.html