android 模块化开发与ARoute之间不得不说的坑

模块化开发因为其合理的解耦性广受青睐,现在关于模块化开发的框架demo已经很多了,对于不同模块之间的跳转也各有各的独门秘方,我用的是阿里的ARoute,这个在GitHub上star已经有9k+了

        一、集成:

        1、需要在用到ARoute的每一个module中都添加以下配置

android {
  
    defaultConfig {
        ......
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

}

dependencies {
    ......
    compile 'com.alibaba:arouter-api:1.4.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}

版本都用最新的,最新版本可以在这里查看

        2、初始化,尽可能早的初始化,最好在application里

public class moduleBaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        if (LogUtil.isDebug(this)) {
            ARouter.openLog();  //开启打印日志
            ARouter.openDebug();// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this);
    }
}

        3、在需要跳转的activity上添加Route注解

@Route(path = "/test/test1")
public class MyActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ......
    }

*注:(1).path路径需要有两级,也就是/xxx/yyy的形式

         (2).不同module下的activity第一级路径不能一样,比如上面的第一级是test,那么在其他module下就不能用test作为第一级路径

        4、在跳转的方法里使用

ARouter.getInstance().build("/shop_module/shop").navigation();

        如果需要携带参数可以使用

ARouter.getInstance().build("/shop_module/shop")
                        .withString("name","zhangsan")
                        .withInt("age",10)
                        .navigation();

        接收参数的activity需要在onCreate()里使用

ARouter.getInstance().inject(this);

        然后添加全局变量和注解,name和age就会被自动赋值成功

    @Autowired(name = "name")
    public String name;
    @Autowired(name = "age")
    public int age;

        *注:括号里name的属性可以省略,但是需要全局变量的变量名和传递值时的键一致,这样会默认以变量名为键来接收相应的值 

        关于navigation方法

 public Object navigation() {
        return navigation(null);
 }

 public Object navigation(Context context) {
        return navigation(context, null);
 }

//带回调
 public Object navigation(Context context, NavigationCallback callback) {
        return ARouter.getInstance().navigation(context, this, -1, callback);
 }

//实现startActivityForResult功能
 public void navigation(Activity mContext, int requestCode) {
        navigation(mContext, requestCode, null);
 }

 public void navigation(Activity mContext, int requestCode, NavigationCallback callback) {
        ARouter.getInstance().navigation(mContext, this, requestCode, callback);
 }

如果你的模块只有一个,那到这里就已经可以顺利的跳转了(一个模块的话也用不着这么麻烦 = =!),但是多个模块的话还有一个坑

刚开始我以为框架可以这么设计

android 模块化开发与ARoute之间不得不说的坑_第1张图片

这时候就出现问题了,ModuleA跳转不到ModuleB和ModuleC的activity,一直提示

ARouter there's no route matched

找不到路径!

在网上找了很多就是没找到我这种情况的,后来我发现我可以在APP和ModuleA之间跳转,却不能在APP和ModuleB、ModuleC之间跳转,问题已经找到了,因为没有在APP里添加ModuleB和ModuleC,然后把改为这样的

android 模块化开发与ARoute之间不得不说的坑_第2张图片

这样改了之后就可以正常跳转了

你可能感兴趣的:(问题记录)