上篇文章讲到,AndroidComponent已经进行了UI跳转的升级改造,可以支持路由的自动注册和路由表的自动生成。但是很多使用组件化方案的同学都表示项目中已经接入ARouter来进行UI跳转,迁移成本比较高。因此我就专门写了这篇文章,讲解一下如何在组件中使用ARouter。
不论用DDComponent自带的方案还是ARouter,要做到组件之间自由并且可控的跳转,需要做到下面几点:
1、路由跳转需要支持传递基本类型和自定义类型(例如Object) 2、路由的跳转需要和组件的生命周期一致,即只有加载的组件才可以跳转,卸载后的组件是不可达的 3、最好生成路由表,组件对外提供的路由可以轻松查阅到
下面我们就从配置开始一步步的讲怎么使用ARouter
basiclib模块中增加以下依赖,basiclib是组件化框架中共用的依赖库:
compile ‘com.alibaba:arouter-api:1.3.0’
在跳转的目标组件的build.gradle中,增加以下配置:
android {
defaultConfig {
…
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
annotationProcessor ‘com.alibaba:arouter-compiler:1.1.4’
…
}
在组件化框架中,我们的示例是从readercomponent跳转到sharecomponent,所以上述配置增加在sharecomponent下面的build.gradle中。
我们以“分享图书” 页面为例
@Route(path = “/share/shareBook”)
public class ShareActivity extends AppCompatActivity {
在进入这个页面,需要传入两个参数,一个是String类型的bookName,一个是自定义类型Author的author
@Autowired
String bookName;
@Autowired
Author author;
由于自定义类型Author需要跨组件传递,我们知道,DDComponent的核心之处就是在组件之间见了一堵墙,在编译期代码和资源都是完全隔离的,所以Author必须定义在share组件向外提供的服务中。所以我们在component中,定义Author类:
public class Author {
private String name;
private int age;
private String county;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
}
现在就解决了Author的可见性问题,但是为了能在路由中传递,按照ARouter的要求,还需要自己实现SerializationService:
@Route(path = “/service/json”)
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {}
@Override
public T json2Object(String text, Class clazz) {
return JSON.parseObject(text, clazz);
}
@Override
public String object2Json(Object instance) {
return JSON.toJSONString(instance);
}
@Override
public T parseObject(String input, Type clazz) {
return JSON.parseObject(input, clazz);
}
}
这里笔者就遇到了一个坑,本来我把这个类定义在readercomponent中,结果运行之后会报空指针异常。只有我把类移到sharecomponent之后,异常才消失。暂时没找到原因,但是定义在这里,加入要跳转到readercomponent怎么办呢?
在组件化框架demo中,发起跳转是readercomponent中的ReaderFragment中,demo中列出了两个示例: 普通跳转
private void goToShareActivityNormal() {
Author author = new Author();
author.setName(“Margaret Mitchell”);
author.setCounty(“USA”);
ARouter.getInstance().build("/share/shareBook")
.withString(“bookName”, “Gone with the Wind”)
.withObject(“author”, author)
.navigation();
}
以及startActivityForResult
private void goToShareActivityForResult() {
Author author = new Author();
author.setName(“Margaret Mitchell”);
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件,需要的小伙伴可以私信我【面试】免费领取或者点击GitHub免费获取!
%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
[外链图片转存中…(img-zmM5ucob-1644995185782)]
[外链图片转存中…(img-dtum5vm9-1644995185784)]