Dagger 2 创建的对象在 Android 中保留多长时间/Dagger 2 如何玩转 Android Activity 生命周期?

How long do objects created by Dagger 2 remain in Android / how does Dagger 2 play with the Android Activity lifecycle?

假设我们有一个 @Singleton 应用程序模块,用于创建和 returns 一个 Hashmap 用于存储配置数据。如果在 hashmap 中修改了配置数据并且 android 应用程序进入后台,并且调用了 onPause() 和 onStop()。

How does Dagger 2 play with the Android Activity lifecycle?

不会。但你可以。

Dagger 只创造 Pojos。了解依赖项并在您需要时将它们提供给您的 Pojos。仅此而已。

如何使用这些对象(组件)完全取决于您。

正如大多数示例所示,通常有一个 AppComponent,保存在 Application 中,每个 Activity 都有某种 ActivtiyComponent

AppComponent 保留在应用程序中,以共享其生命周期——如果应用程序被终止或重新创建,那么组件也是如此,您的对象也是如此。

ActivityComponent 已创建并保存在活动中。再一次,如果 activity 被重新创建,那么组件也会重新创建。它只不过是一个分配给 activity.

中字段的对象

那么为什么应用程序和 activity 组件之间存在差异?

应用程序组件将仅引用应用程序上下文,并提供 类 无需进一步信息即可提供。

activity 组件还将包含有关 activity 的信息。它可以访问视图、片段处理程序等等:Activity 东西!您为每个 activity 创建一个新组件,因为如果您不使用匕首,您也会使用当前的 activity 而不是在任何地方引用(和泄漏!)同一个组件。

回答你的问题

如果现在还不清楚,如果您在 AppComponent(和 @Scope 中创建您的 HashMap!),它将是相同的 HashMap在你的整个应用程序中,如果你正确使用你的AppComponent。一旦应用程序与您的 Application 实例一起终止,它将被销毁。

如果您在 ActivityComponent 中创建它,它将具有与 activity 对象相同的生命周期。如果 savedInstanceState 包含您的数据,您可能需要重新初始化 onCreate 中的内容。


综上所述,不要使用静态变量。如果将组件分配给静态变量,它们将破坏设置并导致内存泄漏。

如果您在 onCreate 中创建组件,则无需任何其他设置即可。只是不要使用静态变量来保存组件,而是确保它分别位于您的 activity 或应用程序中。