Android组件开发学习ARouter+dagger2

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实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值