Android彻底组件化—如何使用Arouter,十年Android编程开发生涯

Posted AI设计大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android彻底组件化—如何使用Arouter,十年Android编程开发生涯相关的知识,希望对你有一定的参考价值。

  1. Android彻底组件化—如何使用Arouter

上篇文章讲到,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)]

Android-ARouter原理解析

参考技术A

ARouter使用的是APT(Annotation Processing Tool)注解处理器,通过给对应的类添加注解,在编译器动态生成对应的路由表文件。这里以分析ARouter的RouteProcessor。在ARouter的使用配置上,需要给base库配置

然后给每个组件都配置annotationProcessor,如果使用kotlin,则使用kapt
接着给每个组件都配置上下面的内容:

这个配置主要是通过这个annotationProcessorOptions获取到key为AROUTER_MODULE_NAME的值,这个值其实就是module的name,这个的作用就是作为一个Root文件的命名的,因为一个module中可能会有多个group,而多个group归属于一个Root,而ARouter的做法就是将一个module作为一个Root。

Element 是一个接口,它只在编译期存在和Type有区别,表示程序的一个元素,可以是package,class,interface,method,成员变量,函数参数,泛型类型等。

它的子类包括ExecutableElement, PackageElement, Parameterizable, QualifiedNameable, TypeElement, TypeParameterElement, VariableElement。

Element的子类介绍:

ExecutableElement:表示类或者接口中的方法,构造函数或者初始化器。

PackageElement :表示包程序元素

TypeELement:表示一个类或者接口元素

TypeParameterElement:表示类,接口,方法的泛型类型例如T。

VariableElement:表示字段,枚举常量,方法或者构造函数参数,局部变量,资源变量或者异常参数。

Element只在编译期可见

asType(): 返回TypeMirror,TypeMirror是元素的类型信息,包括包名,类(或方法,或参数)名/类型。TypeMirror的子类有ArrayType, DeclaredType, DisjunctiveType, ErrorType, ExecutableType, NoType, NullType, PrimitiveType, ReferenceType, TypeVariable, WildcardType ,getKind可以获取类型。

equals(Object obj): 比较两个Element利用equals方法。

getAnnotation(Class<A> annotationType): 传入注解可以获取该元素上的所有注解。

getAnnotationMirrors(): 获该元素上的注解类型。

getEnclosedElements(): 获取该元素上的直接子元素,类似一个类中有VariableElement。

getEnclosingElement(): 获取该元素的父元素,如果是PackageElement则返回null,如果是TypeElement则返回PackageElement,如果是TypeParameterElement则返回泛型Element

getKind():返回值为ElementKind,通过ElementKind可以知道是那种element,具体就是Element的那些子类。

getModifiers(): 获取修饰该元素的访问修饰符,public,private。

getSimpleName(): 获取元素名,不带包名,如果是变量,获取的就是变量名,如果是定义了int age,获取到的name就是age。如果是TypeElement返回的就是类名。

getQualifiedName():获取类的全限定名,Element没有这个方法它的子类有,例如TypeElement,得到的就是类的全类名(包名)。

具体的注解处理流程如下:

首先,看下属性注解处理器生成的文件示例:

AutowiredProcessor这个注解处理器的目的,就是通过这个注解处理器给对应的类中的属性进行赋值的操作。
AutowiredProcessor注解处理器流程:

以上是关于Android彻底组件化—如何使用Arouter,十年Android编程开发生涯的主要内容,如果未能解决你的问题,请参考以下文章

Android-ARouter原理解析

基于ARouter的Android组件化实现

ARouter原理解析之仿ARouter自定义路由框架

使用阿里ARouter路由实现组件化(模块化)开发流程

Arouter之注解处理器

基于MVVM架构,结合阿里ARouter打造的一套Android-Databinding组件化开发方案