组件化框架编写中遇到一个问题,为了降低模块与模块之间的耦合 不得不通过路由进行引用,比如activity 的跳转,因为模块之间互不引用这样一个原则,用过显示开启activity就不现实,隐式调用要知晓action哦等,当然我们也可以通过中间组件进行跳转交互,但是路由无疑提供了一种最简洁的实现
Aroute是使用
在要跳转的module的gradle文件中添加以下依赖
kapt 'com.alibaba:arouter-compiler:1.1.4'
implementation 'com.alibaba:arouter-api:1.3.1'
如果工程用的kotlin,对arouter-compiler包的依赖要用kapt
如果不用kotlin:把kapt 换成annotationProcessor即可
annotationProcessor’com.alibaba:arouter-compiler:1.1.4’
注意两个一拉版本号的对应
apply plugin: 'kotlin-kapt'
然后在 defaultConfig中添加如下配置
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
初始化:
ARouter.openLog();
ARouter.openDebug();
ARouter.init(mApplication_);
在目标activity做如下配置
public static final String ACTIVITY_LOGIN = “/Login/login”;
@Route(path = ABSLoginPluginService.ACTIVITY_LOGIN)
class LoginActivity : BaseActivity(), View.OnClickListener {}
path接受一个String类型,该字符串并且最少包含两个“/”
跳转代码
ARouter.getInstance().build(ABSLoginPluginService.ACTIVITY_LOGIN).with(bundle).navigation();
数据传递:Aroute跳转时候可以携带参数,
众所周知用第三方框架肯定要封装一层自己的代码
package com.dayizhihui.dyzhlib.util.SkipManager;
import android.os.Bundle;
import android.text.TextUtils;
import com.alibaba.android.arouter.launcher.ARouter;
public class SkipManager {
private SkipManager() {
}
public static SkipManager getInstanc() {
return SkipManagerFactory.skipManager;
}
private static class SkipManagerFactory {
private static SkipManager skipManager = new SkipManager();
}
public SkipManager.Builder build() {
return new SkipManager.Builder();
}
public class Builder {
private Bundle bundle;
private String targetClass;
public Builder bundle(Bundle bundle) {
this.bundle = bundle;
return this;
}
public Builder targetClass(String targetClass) {
this.targetClass = targetClass;
return this;
}
public void skip() throws SkipManager.NoTargetClassException {
if (TextUtils.isEmpty(targetClass)) {
throw new NoTargetClassException();
}
if (bundle == null) {
ARouter.getInstance().build(targetClass).navigation();
} else {
ARouter.getInstance().build(targetClass).with(bundle).navigation();
}
}
}
private static class NoTargetClassException extends RuntimeException {
}
}
使用:SkipManager.getInstanc().build().targetClass(ACTIVITY_LOGIN).bundle(bundle).skip();
可以塞进去不同对象类型的数据集,向bundle这种数据载体是在开发中很有用的,特别是在封装中,当然我们也可以通过泛型来实现这样的数据结构