Android 示例
使用 Dagger 編寫 Android 應用程式的一個主要困難是許多 Android 框架類都由作業系統本身例項化,如 Activity
和 Fragment
,但如果 Dagger 可以建立所有注入的物件,則效果最佳。相反,你必須在生命週期方法中執行成員注入。從版本 2.10 開始,dagger 允許使用 dagger.android
,這簡化了使用 Android 元件的匕首。
注入 Activity 物件
-
在應用程式元件中安裝
AndroidInjectionModule
,以確保這些基本型別所需的所有繫結都可用。@Component(modules = {AndroidInjectionModule.class}) public interface AppComponent {}
-
首先編寫一個實現[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> {} }
-
定義子元件後,通過定義繫結子元件構建器的模組並將其新增到注入
Application
的元件,將其新增到元件層次結構中:@Module(subcomponents = MainActivityComponent.class) public abstract class MainActivityModule { @Binds @IntoMap @ActivityKey(MainActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindMainActivityInjectorFactory(MainActivityComponent.Builder builder); }
-
接下來,讓你的
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; } }
-
最後,在你的
Activity.onCreate()
方法中,在呼叫super.onCreate();
之前呼叫AndroidInjection.inject(this)
:public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); } }