阿里巴巴ARouter基本使用方法
2018-04-28 本文已影响1602人
wayDevelop
阿里巴巴开源的路由:https://github.com/alibaba/ARouter
ARouter 在模块化的开发中尤为的重要,为了解耦不在需要依赖另一个模块又能实现模块间的跳转,还未了解的可以点上面的链接去了解,这篇文章只是介绍简单的使用方法。
原生跳转方式的不足
显式跳转,Intent intent = new Intent(activity, XXActivity.class)
;
由于需要直接持有对应class,从而导致了强依赖关系,提高了耦合度
隐式跳转,譬如 Intent intent = new Intent(); intent.setAction(“com.android.activity.MY_ACTION”);
action等属性的定义在Manifest,导致了扩展性较差
规则集中式管理,导致协作变得非常困难。
ARouter的使用
添加依赖和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
添加注解
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
初始化SDK
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
发起路由操作
- 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();
- 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withString("name", "888")
.withInt("age", 11)
.navigation();
3.接受参数
在Activity中获取参数有两种方式,一种是普通Activity那样getIntent().getXXX
加一种是使用@Autowired注解的方式
@Autowired
public String name;
@Autowired(name = "age")
int age;
ARouter.getInstance().inject(this);//添加在onCreate()
// ARouter会自动对字段进行赋值,无需主动获取
Log.d("param", name + age + age);
跳转传递对象
public class TestObj implements Serializable {
public String name;
public int id;
public TestObj() {
}
public TestObj(String name, int id) {
this.name = name;
this.id = id;
}
}
入参数
// 2. 跳转并携带参数
List<TestObj> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
TestObj testObj = new TestObj("Rose" + i, 777);
list.add(testObj);
}
ARouter.getInstance().build(ARouterManager.BModuleActivity)
.withString("name", "老王")
.withInt("age", 18)
.withString("url", "https://a.b.c")
.withSerializable("pac", (Serializable) list)
.navigation();
}
#接受参数
List<TestObj> chooseList = (List<TestObj>) getIntent().getSerializableExtra("pac");//获取list方式
txt.setText("name:" + chooseList.size());
上面是按照原生的getXXX获取跳转参数
另一种得到参数方式
和上述方式一样添加
@Autowired
TestObj obj;
ARouter.getInstance().inject(this);
- 在需要得到参数的Module里面定义,可完全copy过去,表示才用什么方式去转换参数,本文采用的GSON,写完后再跳转便可得到参数,而且JsonServiceImpl 会打印参数,
// 如果需要传递自定义对象,需要实现 SerializationService,并使用@Route注解标注(方便用户自行选择序列化方式),例如:
@Route(path = "/service/json")
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {
}
@Override
public <T> T json2Object(String text, Class<T> clazz) {
Log.w("TAG", "text---" + text);
return new Gson().fromJson(text, clazz);
}
@Override
public String object2Json(Object instance) {
Log.w("TAG", "Object---" + instance);
return new Gson().toJson(instance);
}
}
关注公众号“Android杂货店”,选择关注,干货文章,第一时间送达!
Android杂货店