我可以使用ApplicationContext
来处理SharedPreferences
并开始使用RemoteService
吗?
从逻辑上讲,我认为我可以。这种方法有细微差别吗?
答案 0 :(得分:13)
正如Gunnar Karlsson提到的ContextWrapper的getApplicationContext()用法非常明确,你应该只使用Activity
或Service
上下文来注册/取消注册您的接收器,绑定/取消绑定您的服务(除非确实需要注册静态数据,而不是特定组件)以避免不确定的内存泄漏并且即使您有时忘记取消注册也是安全的,系统将为您清除警告。
但是,对于getSharedPreferences(...)
,您可以随时使用任何ApplicationContext
或Context
。 reason是,已经明确提到
对于任何特定的首选项集(此处为 SharedPreferences ),只有一个实例 所有客户共享的此类。
仅通过应用程序上下文获取引用将不会永久保留引用。它只是通过应用程序上下文引用首选项,就像其他任何一样。所以一旦用户完成它就会被清除。
请注意,通过应用程序上下文注册接收器将保持与您的应用程序关联的全局状态。所以它永远不会被你清除。
如果我错了,请有人纠正我。
希望这会对你有所帮助。
答案 1 :(得分:10)
您应该使用Activity
或Service
Context
,即'this'
,除非您有明确而有力的理由不这样做。如果您明确需要引用应用程序的全局状态,请仅使用ApplicationContext
。
来自ContextWrapper's
getApplicationContext()
方法的Android开发者API文档:
这通常只应在需要生命周期与当前上下文分离的上下文时使用,该上下文与进程的生命周期而不是当前组件相关联。
和
使用ApplicationContext(...)[与...相反]如果您忘记取消注册,取消绑定等,则“活动或服务上下文”很容易导致严重泄漏。
例如,要检索SharedPreferences
中的Activity
,例如更改显示给用户的数据,使用this.getSharedPreferences(...)
,因为没有明确的理由说明您需要使用应用程序的生命周期。同样,在Service
中,使用this.getSharedPreferences(...)
。 (请注意,活动和服务是上下文。它们间接扩展android.content.Context
)
CommonsWare写了一个深入的答案:When to call activity context OR application context?他在那里调用了getApplicationContext()"is almost always wrong"
,并概述了使用它时的几个例外:
CommonsWare还链接到Android框架工程师Dianne Hackborn的answer:
我会给你的第一条规则:如果你不知道为什么需要[应用程序上下文],你可能不需要它(...)你唯一想要使用getApplicationContext()的时候就是你需要一个存在于Activity类(或其他组件)生命周期之外的Context。
关于同一主题的更多答案,讨论与ApplicationContext
:
答案 2 :(得分:1)
是的,您可以使用getApplicationContext()
。在活动或服务中,您可以在getApplicationContext()
或getBaseContext()
关键字的任何位置使用this
,但非常具体的情况除外,例如向UI添加视图或对话框时。
Here是关于Context是什么以及什么是什么的优秀文章,我肯定会建议你这样做。