@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