Java 使用Dagger 2.0仅在两个活动之间共享对象

Java 使用Dagger 2.0仅在两个活动之间共享对象,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我有多个活动扩展BaseActivity。每个活动都有自己的组件和模块。这些组件扩展了具有自己的BaseActivityModule的BaseActivityComponent。 现在我有两个活动,我希望能够注入其他活动无法注入的对象 我该怎么做 我尝试仅为这两个活动创建基本组件和基本模块,但这给了我错误: MyModule以非层次顺序依赖于作用域组件 现在我想让两个活动共享Advanced 此组件由以下两个活动之一使用: @ActivityScope @Component( d

我有多个活动扩展BaseActivity。每个活动都有自己的组件和模块。这些组件扩展了具有自己的BaseActivityModule的BaseActivityComponent。 现在我有两个活动,我希望能够注入其他活动无法注入的对象

我该怎么做

我尝试仅为这两个活动创建基本组件和基本模块,但这给了我错误:

MyModule以非层次顺序依赖于作用域组件

现在我想让两个活动共享Advanced

此组件由以下两个活动之一使用:

@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()
时,我们才能获得保留的组件。在这种情况下,我们需要在其他活动中使用它。对吗?