SharedPreferences的应用程序上下文?

我可以使用ApplicationContext处理SharedPreferences并启动RemoteService吗?

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

Solutions Collecting From Web of "SharedPreferences的应用程序上下文?"

你应该使用ActivityService Context ,即'this' ,除非你有一个明确和强有力的理由不要。 如果您明确需要引用应用程序的全局状态,请仅使用ApplicationContext

ContextWrapper's getApplicationContext()方法的Android Developers API文档:

这通常只应用于需要生命周期与当前上下文分离的Context的情况,该上下文与进程的生命周期相关,而不是当前组件。

使用ApplicationContext(…)[与例如Activity或Service上下文相反],如果忘记取消注册,取消绑定等操作,很容易导致严重的泄漏。

例如,要检索Activity SharedPreferences以例如更改显示给用户的数据,请使用this.getSharedPreferences(...)因为没有明确的理由说明您需要使用该应用程序的生命周期。 同样,在Service ,使用this.getSharedPreferences(...) 。 (请注意Activity和Service 上下文,它们间接地扩展了android.content.Context

CommonsWare已经写了一个深入的答案: 何时调用活动上下文或应用程序上下文? 他在那里调用getApplicationContext() "is almost always wrong"并概述了less数几个例外:

  • 绑定到活动的服务。
  • 有些东西需要与全球范围内的环境联系起来。

CommonsWare也链接到Android框架工程师Dianne Hackborn的答案 :

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

有关与ApplicationContext相关的问题的相同主题的更多答案:

  • Android:ProgressDialog.show()使用getApplicationContext崩溃
  • 活动上下文和应用上下文之间的区别

因为Gunnar Karlsson提到ContextWrapper的getApplicationContext()用法很清楚,你应该只使用ActivityService Context注册/注销接收者,绑定/解除绑定你的服务( 除非真的需要注册静态数据而不是特定的组件 )为了避免不确定的内存泄漏,即使忘记了有时要注销,也是安全的,系统会给你清除警告。

但是,对于getSharedPreferences(...)您始终可以使用任何ApplicationContextContext而不会遇到任何问题。 原因是已经明确提到

对于任何特定的偏好设置(这里是SharedPreferences ),所有客户端共享这个类的一个实例。

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

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

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

希望这会帮助你。

是的,您可以使用getApplicationContext() 。 除了在将视图或对话框添加到UI时的特定情况之外,可以在使用getBaseContext()this关键字的任何地方使用getApplicationContext()

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