Java 使用Dagger 2.0仅在两个活动之间共享对象
我有多个活动扩展BaseActivity。每个活动都有自己的组件和模块。这些组件扩展了具有自己的BaseActivityModule的BaseActivityComponent。 现在我有两个活动,我希望能够注入其他活动无法注入的对象 我该怎么做 我尝试仅为这两个活动创建基本组件和基本模块,但这给了我错误: MyModule以非层次顺序依赖于作用域组件 现在我想让两个活动共享Advanced 此组件由以下两个活动之一使用:Java 使用Dagger 2.0仅在两个活动之间共享对象,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我有多个活动扩展BaseActivity。每个活动都有自己的组件和模块。这些组件扩展了具有自己的BaseActivityModule的BaseActivityComponent。 现在我有两个活动,我希望能够注入其他活动无法注入的对象 我该怎么做 我尝试仅为这两个活动创建基本组件和基本模块,但这给了我错误: MyModule以非层次顺序依赖于作用域组件 现在我想让两个活动共享Advanced 此组件由以下两个活动之一使用: @ActivityScope @Component( d
@ActivityScope
@Component(
dependencies = ApplicationComponent.class,
modules = {
BaseActivityModule.class,
MainActivityModule.class
}
)
public interface MainActivityComponent extends BaseActivityComponent {
void inject(MainActivity mainActivity);
MainActivityPresenter mainPresenter();
AdvertAdvanced advertAdvanced();
}
作为每项活动的基本组成部分,我有以下内容:
@ActivityScope
@Component(dependencies = ApplicationComponent.class, modules = BaseActivityModule.class)
public interface BaseActivityComponent extends ApplicationComponent {
BaseActivity baseActivity();
Navigator navigator();
KeyboardAction keyboardAction();
}
应用程序组件:
@Singleton
@Component(
modules = {
ApplicationModule.class
}
)
public interface ApplicationComponent {
void inject(BaseActivity activity);
Context context();
ApiService apiService();
Picasso picasso();
}
以下是活动模块的外观:
@Module
public class MainActivityModule {
private AdvertAdvanced advertAdvanced;
public MainActivityModule() {
advertAdvanced = new AdvertAdvanced();
}
@Provides
@ActivityScope
MainActivityPresenter provideActivityPresenter(****) {
return ****;
}
@Provides
@ActivityScope
AdvertAdvanced advertAdvanced() {
return advertAdvanced;
}
}
您需要定义一个新组件
advertivetycomponent
,该组件的依赖项为BaseActivityComponent
,子范围为@advertivedscope
。您当前的BaseActivityComponent
应该有自己的作用域,例如@BaseScope
,而您的MainActivityComponent
应该依赖于带有@ConcreteActivityScope
的广告活动组件
基本上,您的范围层次结构是:
- 应用范围(
@Singleton
)
- 基本活动范围(
@BaseScope
)
- 广告活动范围(
@AdvertScope
)
- 主要活动范围(
@ConcreteScope
)
您的组件应该相互扩展,并依赖于它们的超级组件。请显示一些代码。@NeilMasson添加了一些代码。如果您需要更多,请告诉我我们在哪里保存AdvertActivityComponent实例?如果我们将它保留在应用程序中,它与应用程序生命周期相关联,因此它的寿命比我们需要的更长。如果我们让它保持活动状态,那么它只限于一个活动,而另一个活动不能共享对象,这是原始问题的要求。啊,百万美元问题。您可以将它放入onRetainCustomOnConfigurationInstance()
,因为它是活动的组件。非常有趣。我是如何错过学习的?谢谢。如果您使用AppCompatiaActivity
,那么您应该使用onRetainCustomOnConfiguration()
Ok。现在我研究了它,我不确定它是否有助于在不同的活动中共享组件实例。我的理解是,当活动即将被销毁时,onRetainCustomOnConfigurationInstance
可能会帮助我们保留实例,只有当我们尝试相同活动(实例可能不同)的GetLastCustomNonfigurationInstance()
时,我们才能获得保留的组件。在这种情况下,我们需要在其他活动中使用它。对吗?