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