Android,使用 Dagger 2 在整个应用程序中使用 AppModule 上下文

Android, Using AppModule context at whole the app using dagger 2

根据下面的代码:

@Module
public class AppModule {
private Application application;

public AppModule(Application application) {
    this.application = application;
}

@Singleton
@Provides
Context providesContext() {
    return application;
  }

@Singleton
@Provides
IAppDbHelper providesAppDbHelper() {
    // a SQLiteOpenHelper class 
    return new AppDbHelper(application);
  }
}

应用程序组件:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
IAppDBHelper providesIAppDBHelper();
}

主要活动: public class MainActivity 扩展 AppCompatActivity { @注入 IAppDBHelper 助手;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ((MyApplication)getApplication()).getComponent()
            .inject(this);
    // It's OK
    helper.getWritable().execSQL("XXX");

    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
}

第二个活动:

public class SecondActivity extends AppCompatActivity {
@Inject
IAppDBHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    // nullPointer on helper
    helper.getWritable().execSQL("XXX");
}
}

在我的 SecondActivityinjecting 我的 AppComponent 之后,nullPointer 错误修复但我的问题是我必须 inject 我的 AppComponent 每次我想注入 IAppDbHelper?那么 @Singleton 和 inject in inside my MainActivity 是什么意思呢?他们不应该为我的 SecondActivity 注入那个 IAppDbHelper 吗?

您需要获取您的组件并注入 每个 class Android 创建。这通常意味着所有活动、片段和视图。 Dagger 无法创建那些 classes,因此 Dagger 知道外部创建的实例的唯一方法是将其传递到组件的 inject 方法中。

在注入期间,将提供 MainActivity 和 SecondActivity 上的所有 @Inject 字段,并且 Dagger 创建的任何实例也将注入其依赖项,依此类推。这意味着您通常不需要直接在外部创建的 class 之外的组件,例如 Activities 和 Fragments,或者(当然)您创建组件实例本身的应用程序实例。

@Singleton 确实意味着 MainActivity、SecondActivity 以及 Android 可能在您后台应用程序时创建的 MainActivity 或 SecondActivity 的任何未来实例之间的实例将保持相同。但是,您仍然需要为那些 class 请求注入,因为 Android 创建它们,以便接收您用 [= 保证的相同实例12=].