模块化开发因为其合理的解耦性广受青睐,现在关于模块化开发的框架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);
}
如果你的模块只有一个,那到这里就已经可以顺利的跳转了(一个模块的话也用不着这么麻烦 = =!),但是多个模块的话还有一个坑
刚开始我以为框架可以这么设计
这时候就出现问题了,ModuleA跳转不到ModuleB和ModuleC的activity,一直提示
ARouter there's no route matched
找不到路径!
在网上找了很多就是没找到我这种情况的,后来我发现我可以在APP和ModuleA之间跳转,却不能在APP和ModuleB、ModuleC之间跳转,问题已经找到了,因为没有在APP里添加ModuleB和ModuleC,然后把改为这样的
这样改了之后就可以正常跳转了