arouter原理、模块间调用思路

135 阅读1分钟

凡是A,B无依赖关系,且想要互相通信的,其最基本的原理就是通过一个彼此都依赖的第三方C,不管是binder,socket,file,provider还是EventBus,Arouter等,都是这个原理。

一、模块间调用思路

假设现有: app、login、common三个module,其中app跟login无关联,并且都依赖于common,其中app中有个MainActivity,login想要调用MainActivity,根据上述,只能通过共同依赖的common 或 其他公有依赖来实现。

实现方案:

  • 在common中定义一个Map<String,Class<? extends Activity>>。

  • 2 在app中,将MainActivity.class添加到这个map中去。

    map.put("main",MainActivity.class)
    
  • 3 在login中,通过map.get("main")得到MainActivity.class,然后创建Intent来启动MainActivity

    Class<? extends Activity> mainActivityClass= map.get("main")
    startActivity(new Intent(this,mainActivityClass))
    

核心就两点: 注入获取。说白了就是: 你把自己想让别人用的放进公共仓库中(注入),并提供一个凭证(这里的凭证就是字符串"main"),也就是key,想要的时候就拿着凭证从公共仓库中取出来(获取),公共仓库就是彼此都能访问的,那肯定是彼此都依赖的。

二、arouter原理

  • 在编译时通过Apt技术,给代码中含有@Route(path)注解的类生成中间代码。
  • Arouter.init(context)初始化时,进行注入操作,key就是path。
  • Arouter.getIntstance().build(path).navigation()时候用path来进行获取操作,最终获取到要启动的Activity的class对象。