Android Dagger2
前言
在做项目的时候,需要向SystemUI的代码中追加自己的代码,实现一个代替原生StatusBar的功能。
前辈在做这个项目的时候是在Android8.0的系统中做的,我需要把这个功能移植到Android10.0。
在移植代码的时候,发现AOSP中新增加了一个类Dependency(packages/systemui/src/com/android/systemui/Dependency.java)。
查看Dependency中的代码,根据相关的代码注释,才知道这块功能是基于Dagger2实现的。
Dagger2在SystemUI中的使用
关于Dagger2在SystemUI中的使用,在源码中是有相关的说明文档的(packages/systemui/docs/dagger.md)。在该文档中详细的介绍了Dagger2在SystemUI中的使用。
Dagger2的基础说明
-
什么是依赖注入 Dependency Injection
依赖注入是实现控制反转(IoC)的一个方案。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
所以 IoC 不是技术,而是思想,利用这种思想可以降低对象间的耦合,提高代码重用率。
通俗的来讲呢,就是一个类中需要依赖其他对象时,不需要你亲自为那些需要依赖的对象赋值,而是将为那些对象赋值的操作交给了IOC框架。
Dagger2在AndroidStudio中的配置
在这边突然追加一个配置的章节主要是因为下面的关键字说明我将结合一些简单的代码。
我的AndroidStudio的版本是4.0.2
只需要在Module:app的build.gradle的dependencies中追加如下的配置项(最后三行配置):
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//引入dagger2
implementation 'com.google.dagger:dagger:2.4'
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
//java注解
compileOnly 'org.glassfish:javax.annotation:10.0-b28'
}
Dagger2的关键字的说明
查看Dependency.java的代码,可以看到如下的关键字:
@Inject
主要有两个作用 #1 作为依赖注提供方: 使用@Inject注解构造方法。 注解类的构造函数,让Dagger2
帮我们实例化该类,并注入。 #2 作为依赖需求方: 使用@Inject注解成员。 如果一个成员变量被@Inject
注解修饰,并且成员类的构造函数也被@Inject
注解,那么dagger2
帮我们实例化该成员类,并注入。 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。