Android 示例

使用 Dagger 编写 Android 应用程序的一个主要困难是许多 Android 框架类都由操作系统本身实例化,如 ActivityFragment,但如果 Dagger 可以创建所有注入的对象,则效果最佳。相反,你必须在生命周期方法中执行成员注入。从版本 2.10 开始,dagger 允许使用 dagger.android,这简化了使用 Android 组件的匕首。

注入 Activity 对象

  1. 在应用程序组件中安装 AndroidInjectionModule,以确保这些基本类型所需的所有绑定都可用。

    @Component(modules = {AndroidInjectionModule.class})
    public interface AppComponent {}
    
  2. 首先编写一个实现[AndroidInjector] [AndroidInjector]的 @Subcomponent,其中包含扩展[AndroidInjector.Builder] [AndroidInjector.Builder]的 @Subcomponent.Builder

    @Subcomponent
    public interface MainActivityComponent extends AndroidInjector<MainActivity> {
        @Subcomponent.Builder
        abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
    }
    
  3. 定义子组件后,通过定义绑定子组件构建器的模块并将其添加到注入 Application 的组件,将其添加到组件层次结构中:

    @Module(subcomponents = MainActivityComponent.class)
    public abstract class MainActivityModule {
    
        @Binds @IntoMap @ActivityKey(MainActivity.class)
        abstract AndroidInjector.Factory<? extends Activity>
        bindMainActivityInjectorFactory(MainActivityComponent.Builder builder);
    }
    
  4. 接下来,让你的 Application 实现 HasDispatchingActivityInjector@Inject 一个 DispatchingAndroidInjector<Activity>activityInjector() 方法返回:

    public class MyApp extends Application implements HasDispatchingActivityInjector     {
    
        @Inject
        DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
    
        @Override
        public void onCreate() {
           super.onCreate();
           DaggerAppComponent.create().inject(this);
        }
    
        @Override
        public DispatchingAndroidInjector<Activity> activityInjector() {
            return dispatchingActivityInjector;
        }
    }
    
  5. 最后,在你的 Activity.onCreate() 方法中,在调用 super.onCreate(); 之前调用 AndroidInjection.inject(this)

    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            AndroidInjection.inject(this);
            super.onCreate(savedInstanceState);
        }
    }
    

此示例基于官方匕首文档 。工作样本可以在 github上找到