1.ARouter
(1)组件化开发,先创建项目,如下图所示
(2)在baseRes中的bulid.gradle添加信息:
dependencies {
api 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
在app、Home、IM的bulid.gradle中添加(每个组件都应该添加)
dependencies {
//不添加此行,则会报Router::There is no route match the path
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
(3)在app的build.gradle中添加
apply plugin: 'com.alibaba.arouter'
在项目根目录的build.gradle
buildscript {
dependencies {
classpath "com.alibaba:arouter-register:1.0.2"
}
}
(4)使用ARouter进行跳转,在app中activity设置路由
//无参数
ARouter.getInstance().build("/home/AActivity") .navigation();
//有参数
ARouter.getInstance().build("/home/AActivity")
.withString("A", "123")
.navigation();
设置要跳转activity的注释
@Route(path = "/home/AActivity", extras = 1)
public class AActivity extends AppCompatActivity {
}
如果是接收参数的则要使用@Autowired,自动赋值。
@Autowired
String A;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
//自动接收传来的值
ARouter.getInstance().inject(this);
}
关于拦截器简单说明一下,页面跳转的时候就会触发,postcard携带extras的值,根据extras的值来处理。
(5)如果要运行单独的组件则需要配置一下。
在项目根目录gradle.properties中添加如下
isNeedHomeModule = true //对应home
isNeedIMModule = true 对用IM
在app的build.gradle添加
if (isNeedHomeModule.toBoolean()) {
implementation project(path: ':Home')
}
下面只拿Home来举例,设置home中的build.gradle,isNeedHomeModule 为true 是library;为false,是application,可以运行。
if (isNeedHomeModule.toBoolean()) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
设置AndroidManifest文件(需要设置好application中属性,如logo,名字等)
android {
sourceSets {
main {
if (!isNeedHomeModule.toBoolean()) {
manifest.srcFile 'src/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
exclude("**/debug/**")
}
}
}
}
}
独立运行需要
defaultConfig {
if (!isNeedHomeModule.toBoolean()) {
applicationId "cn.sd.xd.zujian.home"
}
}
2.dagger2
简要说明一下作用,假如有一个user类,只有一个构造函数且只有一个参数,有5处使用,则现在要修改这个构造方法,则5处都要修改,使用dagger2则不需要修改。此框架还可以直接设置单例模式。
就上面的项目继续,添加dagger2。
(1)在BaseRes的build.gradle添加
api 'com.google.dagger:dagger:2.23'
annotationProcessor 'com.google.dagger:dagger-compiler:2.23'
(2)在其他组件的build.gradle添加
annotationProcessor 'com.google.dagger:dagger-compiler:2.23'
(3)使用,在activty中使用@Inject。
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
}
在User 类中
public class User {
@Inject
public User() {
}
}
这样配置完,还不能使用。还需要配置@Component如下:
//此接口要与AActivity 放在同一组件中,因为inject的参数必须是特定的某一activity,不能是AppCompatActivity。
//Singleton 单列
@Singleton
@Component(modules = ActivityModule.class)
public interface ActivityComponent2 {
void inject(AActivity aActivity);
}
在要使用的activity中
protected void onCreate(Bundle savedInstanceState) {
......
DaggerActivityComponent2.builder().build().inject(this);
}
这样配置完成后。就可以使用了,user会自动实例化。
假如现在要实例化的类,在jar中,我们就无法在这个类中使用@Inject,所以@Module就是来解决这个问题的。
@Module
public class ActivityModule {
@Provides//提供对象的实例化
@Singleton
Test providerTest() {
return new Test();
}
}
还需要设置一下ActivityComponent2
@Singleton
@Component(modules = ActivityModule.class)
public interface ActivityComponent2 {
void inject(AActivity aActivity);
}
这样Test可以用@Inject实例化。