1、集成
参考官方文档https://github.com/alibaba/ARouter
在module的build.gradle中添加对应引用,注意版本对齐
defaultConfig {
......
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
dependencies {
.....
implementation 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
2、使用
在Application里初始化
ARouter.init(this);
在对应的页面使用注解标记页面路由路径,有严格的规则,以 /…/… 格式 例如
@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.module1_main_activity);
}
}
标记之后编译项目 会在build文件中生成对应标记类
在想跳转的地方调用跳转api
ARouter.getInstance().build("/module1/mainActivity").navigation();
传参数和接收参数,所有基础类型和序列化的都可以,不满足的也可用bundle
ARouter.getInstance().build("/module1/mainActivity").withString("key","参数").navigation();
接收参数 使用注解和注入
@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {
@Autowired
String key;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.module1_main_activity);
ARouter.getInstance().inject(this);
Log.d("Module1_MainActivity", key);
}
}
简单的跳转和参数传递基本可以满足日常需求,达到模块化的解耦,没有模块直接依赖,必然在引用方面是比较麻烦的,如找目标类,维护路由表
3、高级用法 模块之间通信
除了界面跳转之外,Arouter还能跨模块调用其他模块实现的方法
1 、在基础模块定义接口 继承 IProvider
public interface TestServer extends IProvider {
void callServer();
}
其他模块依赖基础模块,实现服务,并设置好对应路由路径
例如 模块1
@Route(path = "/module1/server")
public class Module1Server implements TestServer {
@Override
public void init(Context context) {
}
@Override
public void callServer() {
Log.d("Module1Server", "模块1的服务");
}
}
模块2
@Route(path = "/module2/server")
public class Module2Server implements TestServer {
@Override
public void callServer() {
Log.d("Module2Server", "模块2的服务");
}
@Override
public void init(Context context) {
}
}
此时模块1和模块2没有依赖关系 通过控制反转 ioc 注入 初始化对象实例
如模块1调用模块2方法
@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {
@Autowired(name = "/module2/server")
TestServer testServer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.module1_main_activity);
ARouter.getInstance().inject(this);
testServer.callServer();
}
}
通过注解的路由路径找到要实例化的类
@Autowired(name = "/module2/server")
TestServer testServer;
通过注入 初始化
ARouter.getInstance().inject(this);
即可把testServer 实例化成 Module2Server 对象了
4、拦截器
声明拦截器,这里是注解实现的,是全局的拦截器。例如:登陆问题
@Interceptor(priority = 2)
public class MyInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.d("MyInterceptor", "拦截器");
callback.onContinue(postcard);
}
@Override
public void init(Context context) {
}
}
5、降级服务
统一处理跳转失败的情况 path 随便写
/**
* 降级服务 path 任意
* */
@Route(path = "/aaa/aaa")
public class DegradeServiceImpl implements DegradeService {
@Override
public void onLost(Context context, Postcard postcard) {
Log.d("DegradeServiceImpl", "postcard:" + postcard);
}
@Override
public void init(Context context) {
}
}
日常使用 足够了