Android主流三方库源码分析:Dagger2,安卓事件分发机制详解

本文详细解析了Dagger2在Android中的应用,通过分析AbstractAllActivityModule、AbstractAllFragmentModule和AbstractAllDialogFragmentModule的子组件,展示了Dagger2如何构建AppComponent并注入Application。讲解了DaggerAppComponent.builder().build()的构建过程,以及AndroidInjection.inject(this)如何将Activity纳入依赖注入管理。文章深入探讨了Dagger2的依赖注入机制,包括Builder模式、AndroidInjector接口和DispatchingAndroidInjector的使用。
摘要由CSDN通过智能技术生成

@Module(subcomponents = {BaseActivityComponent.class})

public abstract class AbstractAllActivityModule {

@ContributesAndroidInjector(modules = MainActivityModule.class)

abstract MainActivity contributesMainActivityInjector();

@ContributesAndroidInjector(modules = SplashActivityModule.class)

abstract SplashActivity contributesSplashActivityInjector();

}

复制代码

可以看到,项目下的所有xxxActiviity都有对应的contributesxxxActivityInjector()方法提供实例注入。并且,注意到AbstractAllActivityModule这个模块依赖的 subcomponents为BaseActivityComponent,前面说过了,每一个继承于BaseActivity的Activity都继承于BaseActivityComponent这一个subcomponents。同理,AbstractAllFragmentModule与AbstractAllDialogFragmentModule也是类似的实现模式,如下所示:

// 1

@Module(c = BaseFragmentComponent.class)

public abstract class AbstractAllFragmentModule {

@ContributesAndroidInjector(modules = CollectFragmentModule.class)

abstract CollectFragment contributesCollectFragmentInject();

@ContributesAndroidInjector(modules = KnowledgeFragmentModule.class)

abstract KnowledgeHierarchyFragment contributesKnowledgeHierarchyFragmentInject();

}

// 2

@Module(subcomponents = BaseDialogFragmentComponent.class)

public abstract class AbstractAllDialogFragmentModule {

@ContributesAndroidInjector(modules = SearchDialogFragmentModule.class)

abstract SearchDialogFragment contributesSearchDialogFragmentInject();

@ContributesAndroidInjector(modules = UsageDialogFragmentModule.class)

abstract UsageDialogFragment contributesUsageDialogFragmentInject();

}

复制代码

注意到注释1和注释2处的代码,AbstractAllFragmentModule和AbstractAllDialogFragmentModule的subcomponents为BaseFragmentComponent、BaseDialogFragmentComponent,很显然,同AbstractAllActivityModule的子组件BaseActivityComponent一样,它们都是作为一个通用的子组件。

然后,回到我们配置项目下的Application下面的注释2处的代码,在这里使用了第一步Dagger为我们构建的DaggerAppComponent对象将当期的Application实例注入了进去,交给了Dagger这个依赖大管家去管理。最终,Dagger2内部创建的mAndroidInjector对象会在注释3处的地方进行实例赋值。在注释4处,实现HasActivityInjector接口,重写activityInjector()方法,将我们上面得到的mAndroidInjector对象返回。这里的mAndroidInjector是一个类型为DispatchingAndroidInjector的对象,可以这样理解它:它能够执行Android框架下的核心成员如Activity、Fragment的成员注入,在我们项目下的Application中将DispatchingAndroidInjector的泛型指定为Activity就说明它承担起了所有Activity成员依赖的注入。那么,如何指定某一个Activity能被纳入DispatchingAndroidInjector这个所有Activity的依赖总管的口袋中呢?接着看使用步骤4。

4、最后,将目标Activity纳入Activity依赖分配总管DispatchingAndroidInjector的囊中。

----------------------------------------------------------------------

很简单,只需在目标Activity的onCreate()方法前的super.onCreate(savedInstanceState)前配置一行代码 AndroidInjection.inject(this),如下所示:

public abstract class BaseActivity extends AbstractSimpleActivity implements

AbstractView {

@Inject

protected T mPresenter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

AndroidInjection.inject(this);

super.onCreate(savedInstanceState);

}

}

复制代码

这里使用了@Inject表明了需要注入mPresenter实例,然后,我们需要在具体的Presenter类的构造方法上使用@Inject提供基于当前构造方法的mPresenter实例,如下所示:

public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {

@Inject

MainPresenter(DataManager dataManager) {

super(dataManager);

this.mDataManager = dataManager;

}

}

复制代码

从上面的使用流程中,有三个关键的核心实现是我们需要了解的,如下所示:

  • 1、appComponent = DaggerA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值