前言
阿里巴巴自研路由框架,主要解决组件间、模块间的 界面跳转 问题
GitHub
https://github.com/alibaba/ARouter
组件化模式简述
随着APP版本不断迭代,新功能的不断增加,业务也会变的越来越复杂。在这持续增长的趋势下,代码量越来越庞大,编译效率增加,维护成本增加,协同开发成本增加。我们需要一种新的模式开解决这些问题。
模块化模式简述
针对庞大的业务需求,我们将业务模块化开发。同时也将代码模块化管理,主要解决项目臃肿、耦合严重、代码的复用性
回归正题
1.配置 (adding configurations)
配置ARouter AROUTER_MODULE_NAME
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
注: 未配置configurations出现的错误
错误: ARouter::Compiler An exception is encountered, [These no module name, at 'build.gradle', like :
2.配置(adding dependencies)
导入相关类库
//方法库
implementation 'com.alibaba:arouter-api:?'
//注解解释库
annotationProcessor 'com.alibaba:arouter-compiler:?'
3.初始化(Initialize the SDK at you application )
经可能早的初始化ARouter SDK ,所有我们在application中初始化
//openLog openDebug 必须初始化之前调用
//当前应用debug模式
if (isDebug()) {
//开启打印输出
ARouter.openLog();
//开启调试模式-->如果是线上模式关闭改模式,否则有安全隐患
ARouter.openDebug();
}
ARouter.init(mApplication);
4.添加注释(Add annotations)
目标页面添加@Route注解
path:模板页面路径,必须以斜杠开头两级以上路径
group:页面组,默认为module名作为命名
@Route(path = "/Xxx_module/XxxActivity")
public class XxxActivity extend Activity {
...
}
@Route(path = "/Xxx_module/XxxFragment")
public class XxxFragment extend Fragment {
...
}
5. 跳转页面(Initiate the routing)
//Activity跳转
ARouter.getInstance().build("/Xxx_module/XxxActivity").navigation();
//Fragment引入
Fragment fragment = (Fragment) ARouter.getInstance().build("/Xxx_module/XxxFragment").navigation();
6. 跳转页面携带参数(Initiate the routing Jump with parameters)
参数携带已withXXX()方法进行对应数据类型参数携带
特别说明:withObject()不可直接使用:如何使用见向下继续看
ARouter.getInstance().build("/Xxx_module/XxxActivity")
.withString("name", "小哲")
.withInt("age", 18)
.withObject("user", new UserEntity("小哲姐姐", 19))
.navigation();
6.1 携带参数withObject(Initiate the routing Jump with parameters)
在页面跳转传递自定义对象参数时,我们要进行序列号服务的创建。
好-。-如何创建公共的序列化服务,只需要创建一次,作为工具类。
1.实现ARouter接口SerializationService
2.完成对应方法实现,我们可以使用JSON 或 GSON来进行方法实现,进行对象和字符串的转换
@Route(path = "/service/gson")
public class GosnServiceImp implements SerializationService {
private Gson gson;
@Override
public <T> T json2Object(String input, Class<T> clazz) {
return gson.fromJson(input, clazz);
}
@Override
public String object2Json(Object instance) {
return gson.toJson(instance);
}
@Override
public <T> T parseObject(String input, Type clazz) {
return gson.fromJson(input, clazz);
}
@Override
public void init(Context context) {
gson = new Gson();
}
}
7. 拦截器(Declaration Interceptor)
使用场景,全部页面跳转进行对应业务判读,是否进行拦截。最经典的业务场景,登录状态判读,未登录进行拦截,跳转登录页面
1.实现ARouter IInterceptor 接口
2.添加注释方法@Interceptor
priority 执行优先级,多拦截器执行顺序
name 拦截器命名
3.获取跳转页面路径 postcard.getPath()
@Interceptor(priority = 6)
public class LoginIntercept implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.e("GAO", "进入LoginIntercept中");
//获取跳转页面路径
String path = postcard.getPath();
if (isLogin) {
//将事件交还给ARouter
Log.e("GAO", "已经登录了");
callback.onContinue(postcard);
} else {
Log.e("GAO", "未登录");
switch (path) {
case "/app_module/SecondActivity":
callback.onInterrupt(null);
break;
default:
callback.onContinue(postcard);
break;
}
}
}
@Override
public void init(Context context) {
}
}
8. 拦截器拦截回调监听
ARouter.getInstance().build("/app_module/SecondActivity").navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(Postcard postcard) {
Log.e("GAO", "我被拦截了 -- 跳转到登陆 -- 处理相关业务");
}
});