假设我有一个类A
定义如下:
class A {
Activity c;
public A(Activity c) {
this.c = c;
// do something
}
public void dosomething() { }
}
我的活动定义如下:
public class MyActivity extends AppCompatActivity {
@Inject A myObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myObject.dosomething();
}
}
如何向我的对象提供当前活动?
答案 0 :(得分:3)
您必须将活动提供给负责构建myObject
的组件。一种方法是创建ActivityScope
:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
在此范围内,您可以使用inject()
方法创建一个用于注入活动字段的组件。
请注意,如果您希望MyActivityComponent
中的组件的对象图可用,则可以在更宽范围的组件上添加依赖项。在这里,我使它依赖于一个名为ApplicationComponent
的类。
@ActivityScope
@Component(
dependencies = {ApplicationComponent.class},
modules = { MyActivityModule.class}
)
public interface MyActivityComponent {
void inject(MyActivity myActivity);
}
该组件有一个提供MyActivity
实例的模块。
@Module
public class MyActivityModule {
private final MyActivity myActivity;
public MyActivityModule(MyActivity myActivity) {
this.myActivity = myActivity;
}
@Provides
@ActivityScope
MyActivity provideActivity() {
return myActivity;
}
}
在您的活动onCreate()
中,您现在可以将this
提供给该模块,该模块可在ActivityScope
内使用。
//Inside your activity's onCreate:
DaggerMyActivityComponent.builder()
.myActivityModule(new MyActivityModule(this))
.build()
.inject(this);
修改强>
在回答您的问题时,您需要使用A
在@Inject
中注释构造函数。这将为Dagger提供一种创建它实例的方法。如果那是不可能的,你可以在模块中添加一个提供者方法,但它还有点工作:
//Don't do this if you can annotate the constructor with @Inject.
@Provides
A provideA(MyActivity myActivity) {
return new A(myActivity);
}