2012-02-02 63 views
18

我可以使用ApplicationContextSharedPreferences一起使用吗?例如,RemoteServiceSharedPreferences的应用程序上下文?

从逻辑上讲,我认为我可以。这种方法有没有细微差别?

+3

这个问题有什么问题? 它太虚拟吗? – user1074896 2012-02-02 10:55:27

+0

认为有没有人看到谁可以给出答案:( – 2012-03-30 16:07:15

+0

看看这个,它可能有所帮助:http://stackoverflow.com/questions/987072/using-application-context-everywhere – 2012-03-30 16:10:03

回答

1

是的,你可以使用getApplicationContext()。您可以在活动或服务中使用getBaseContext()this关键字的任何地方使用getApplicationContext(),但非特定情况下(例如将视图或对话框添加到UI时)除外。

Here是关于什么是上下文和什么是一个很好的文章,我肯定会建议通过。

10

您应该使用ActivityServiceContext,即'this',除非您有明确的理由不要。如果您明确需要参考应用程序的全局状态,请仅使用ApplicationContext

从上ContextWrapper'sgetApplicationContext()方法Android开发者API文档:

这通常如果你需要一个上下文的生命周期是从当前上下文独立的,才应使用,这是联系在一起的过程的生命周期,而不是当前组件。

使用的ApplicationContext(......)[而不是例如一个活动或服务上下文]可以很容易地导致严重的泄漏如果忘记注销,解除绑定等

例如,在一个Activity检索SharedPreferences到例如更改显示给用户的数据,使用this.getSharedPreferences(...),因为没有明确的理由说明为什么需要进入应用程序的生命周期。同样,在Service中,使用this.getSharedPreferences(...)。 (请注意,活动和服务场合,它们间接地延长android.content.Context。)

CommonsWare写了深入的答案:When to call activity context OR application context?,他做的是调用getApplicationContext()"is almost always wrong",并概述了一些例外的时候使用它的情况下:

  • 从活动绑定到服务。
  • 需要将某些东西与全局范围内的上下文绑定。

CommonsWare还链接到answer通过Android框架工程师戴安娜Hackborn:

第一条规则我会给你:如果你不知道你为什么需要[应用上下文],你可能不要不需要它(...)唯一需要使用getApplicationContext()的时候是需要一个存在于Activity类(或其他组件)生命周期之外的Context。

上就与ApplicationContext问题进行讨论同一主题的更多答案:

10

为贡纳尔·卡尔松提到ContextWrapper的getApplicationContext()使用它很清楚,您应该只使用ActivityService语境注册/注销您的接收器,绑定/解除绑定的服务(除非是真正需要的静态数据,而不是特定的组件注册),以避免不确定的内存泄漏,即使你忘记了是安全的有时要注销,系统会通过警告为您清除它。

但是,对于getSharedPreferences(...),您始终可以顺利使用任何ApplicationContextContext。该reason是,它已被明确提及

对于任何特定的偏好组(这里SharedPreferences),还有的 该类所有客户共享一个实例。

只通过应用程序上下文获取引用不会永久保留引用。它只是像任何其他应用程序上下文一样参照偏好。所以一旦用户完成它就会被清除。

请注意,通过应用程序上下文注册接收器将被维护为与您的应用程序相关联的全局状态。所以它永远不会被清除。

如果我错了,请有人纠正我。

希望这会帮助你。

+2

我想相信这一点,希望它是正确的。 – 2015-04-16 12:19:14

+0

@Toro,请添加您的发现以支持评论。最终,所有用户都应该知道您为什么认为上述答案是不正确的。 – 2017-08-21 07:10:30

相关问题