Android getApplicationContext内存管理

3

在这篇文章中

何时调用Activity Context或Application Context?

马克·墨菲说:

"如果从getApplicationContext()获取的Context持有您在其上调用但未清理的某些内容,则可能会创建内存泄漏。对于Activity,如果它持有某些内容,一旦Activity被垃圾回收,其他所有内容也会被清除。应用程序对象将保留您的进程的生命周期。"

哪些调用会创建应用程序上下文保留的内容?

我有一个需要上下文的库,用于各种事情。它可以在后台运行并跨越活动,但使用和更新活动上下文将是有问题的。

我认为这可能是使用应用程序上下文的首选场合之一?


是的,使用应用程序上下文。 - Blundell
2个回答

1

如果库中的对象寿命可以跨越多个活动,则绝对使用应用程序上下文。使用活动上下文会防止垃圾回收器丢弃上下文。由于活动上下文可以保存相当多的数据,因此您的内存使用量可能会大幅增加。

此外,如果活动关闭,则放弃其窗口令牌。尝试使用该上下文生成对话框将导致BadTokenException。因此,如果对象与活动生命周期没有直接关联,则没有将活动上下文提供给对象的意义。

编辑:这里是一个可靠的来源


这就是我考虑使用getApplicationContext的原因,它比跨活动管理上下文要容易得多,但我真的很想知道(如果可能的话)在应用程序上下文的情况下如何泄漏内存? - Cullan
唯一的额外风险是,如果库在某个时刻依赖于上下文被使无效,或者库中存在错误导致其在上下文的生命周期内一直停留在内存中。 - pgsandstrom
请允许我澄清:库有可能使上下文引用它。如果是这样,那么只要上下文存在,它就会一直留在内存中。然而,这将是库设计上非常糟糕的一部分。 - pgsandstrom

0

在我的一个库项目中,我遇到了同样的问题。

即使在库项目中,建议使用Activity Contexts。有很多组件只需要活动上下文。例如:对话框。因此,我的建议是从您的项目传递活动上下文到库项目。

虽然应用程序上下文可以在库项目中保存序列化问题。


抱歉,我在原始问题中没有说明,该库中没有GUI组件。 - Cullan
你应该使用应用程序上下文。 - vineet

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