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上找到