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); } }