中间件项目打算模块化重构,其中很重要的一个问题如何降低各模块的依赖?路由架构有助于降低模块的依赖,了解到Arouter提供路由功能,学习一下。
2. Arouter 项目结构初识
Arouter项目结构:
arouter-annotation : 自定义注解实现。(编译和运行都需要此包)
arouter-compiler: 自定义注解处理器实现,目标项目编译时执行自定义注解处理器,生成期望代码。(只存在编译时)
arouter-api :提供接口给上层访问,执行arouter-compiler生成的代码。(编译和运行都需要此包)
之前有了解过ButterKnife(基于自定义注解处理器实现BindView等),一看Arouter的项目结构,大致清楚也是基于自定义处理器实现的。因为中间件只需要跨模块API调用,接下来就只分析Arouter关于跨模块API调用源码。
3. Arouter跨模块API调用Demo
MainActivity通过arouter-api提供的接口来做到跨模块API调用。
接下来结合源码来分析Arouter是如何做到跨模块API调用的。
1. Arouter是什么?
Android平台中对页面、服务提供路由功能的中间件
典型应用
- 从外部URL映射到内部页面,以及参数传递与解析
- 跨模块页面跳转,模块间解耦
- 拦截跳转过程,处理登陆、埋点等逻辑
- 跨模块API调用,通过控制反转来做组件解耦
2. Arouter 项目结构初识
Arouter项目结构:
arouter-annotation : 自定义注解实现。(编译和运行都需要此包)
arouter-compiler: 自定义注解处理器实现,目标项目编译时执行自定义注解处理器,生成期望代码。(只存在编译时)
arouter-api :提供接口给上层访问,执行arouter-compiler生成的代码。(编译和运行都需要此包)
之前有了解过ButterKnife(基于自定义注解处理器实现BindView等),一看Arouter的项目结构,大致清楚也是基于自定义处理器实现的。因为中间件只需要跨模块API调用,接下来就只分析Arouter关于跨模块API调用源码。
3. Arouter跨模块API调用Demo
通过依赖注入解耦:服务管理(一) 暴露服务
// 声明接口,其他组件通过接口来调用服务
public interface IService extends IProvider {
void sayHello(Context context );
}
// 实现接口
@Route(path = "/service/hello", name = "测试服务")
public class MyService implements IService {
@Override
public void sayHello( Context context ) {
Toast.makeText( context , "hello", Toast.LENGTH_SHORT).show();
}
@Override
public void init(Context context) {
}
}
通过依赖注入解耦:服务管理(二) 发现服务
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((IService) ARouter.getInstance().build("/service/hello").navigation()).sayHello(this);
}
}
demo编译后,arouter-compiler会自动生成如下三个类:
ARouter$$Group$$service
ARouter$$Providers$$app
ARouter$$Root$$app
MainActivity通过arouter-api提供的接口来做到跨模块API调用。
接下来结合源码来分析Arouter是如何做到跨模块API调用的。