Dagger 2组件、模块和作用域的生命周期

45

我阅读了很多关于Dagger 2的帖子和教程:

http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/

https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/

https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2

Dagger 2中组件(对象图)的生命周期是由什么决定的?

等等。

但我仍然对组件的生命周期以及它与模块和作用域的关系感到困惑。 我希望确保在只需要单例时不会创建多个对象实例。 希望有人能解答以下问题:

在应用程序类中构建的组件的生命周期是什么?

在Activity或Fragment类中构建的组件的生命周期是什么?

如果我想从组件获取单例实例,我必须使用@Singleton或自定义作用域对组件进行注释,并在应用程序类中构建该组件吗?

如果我在应用程序类中构建一个组件,这是否意味着通过此组件可用的所有对象实例将是整个应用程序中的单例实例,直到应用程序被终止或重新启动?

我有一个具有自定义作用域(例如@ActivityScope)的组件,并且我在Activity中构建了该组件,那么通过该组件注入的对象实例是否会在此Activity的onDestroy()调用后自动销毁?

我有一个带有自定义作用域(@ActivityScope)的组件,我在ActivityA和ActivityB中构建此组件。那么,ActivityA和ActivityB会共享来自此组件的相同对象实例,还是它们将拥有相同对象的自己的实例?

1个回答

40

我的理解是:

请记住两件事情(当我第一次阅读时,1项使所有内容更加清晰):

1)组件的生命周期由你决定,或者说它只能在创建组件的类没有被销毁时存在(例如Android活动或片段)。

2)如果您不对提供方法进行注释(必须与组件注释相同),则每次请求时都会创建新对象。

在应用程序类中构建的组件的生命周期是什么?

在应用程序类中构建的组件的生命周期由你决定。也就是说,您可以随时创建它并在任何时候删除它,只要您将其创建在扩展android应用程序类的类中(这样组件对象将在Android应用程序运行时存在),与构建在活动类中的组件相比-它将在活动存在的时间内存在,因此可能会在方向更改时被销毁。 请注意,如果由于某种原因您没有在Application类的onCreate()方法中创建您的ApplicationComponent(例如稍后发生了某些事件),则当Android OS处于低内存状态且用户关闭您的应用程序时,它可能会被销毁(置为空),然后当用户回到您的应用程序(到上一个可见的Activity)时,当它早些时候被杀死并且您要求您的应用程序组件执行某些操作时,请检查它是否不为空。

在活动或片段类中构建的组件的生命周期是什么?

我已经在上面的答案中部分回答了。如果您在Fragment / Activity中创建组件,则只要您想要或者只要活动或片段未因方向更改或低内存而销毁,它就会一直存在。

如果我想从组件获取单例实例,我必须使用@ Singleton或自定义作用域对组件进行注释,并在应用程序类中构建该组件吗?

这取决于您要在哪里使用此单例。如果您想在单个活动中使用单例,可以创建例如@ActivityScope注释,并用此注释注释提供方法和ActivityComponent,然后在onCreate()Activity方法中创建ActivityComponent,只要您的活动存在,就会拥有一个单例(如果您计划在同一活动的不同片段之间共享单例,则可能会很有用)。 如果您想在应用程序中的不同活动/片段之间使用单例,则最好的方法是在AppModule中创建它,并将提供方法和应用程序组件注释为singleton。

如果我在应用程序类中构建一个组件,那么通过该组件提供的所有对象实例是否都将是单例实例,直到应用程序被杀死或重启?

如果您使用@Singleton注释提供方法,则是的。

我有一个带有自定义作用域的组件,比如说@ActivityScope,在一个活动中构建了这个组件,那么通过这个组件注入的对象实例会在这个活动的onDestroy()调用后自动销毁吗?

是的

再次假设我有一个带有自定义作用域的组件,比如说@ActivityScope,我在ActivityA和ActivityB中构建了这个组件,那么ActivityA和ActivityB是否会共享来自此组件的相同对象实例,还是它们将拥有相同对象的自己实例?

它们将拥有自己的实例


请问您能否提供有关Dagger2文档中1和2的证明? - Sever
当Android操作系统内存不足并且用户关闭了您的应用程序时,它可以被销毁(置空)。
  • 这是非常奇怪的短语。Android无法管理您正在运行的应用程序中的引用。它所能做的就是杀死整个进程或调用其拥有的架构组件(如活动)的生命周期方法。
- nsk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接