何时调用活动上下文或应用程序上下文?
有很多关于这两种情况是什么的帖子。但我仍然没有把它说得很对
据我了解,目前为止:每个都是它的类的一个实例,这意味着一些程序员建议您尽可能多地使用this.getApplicationContext()
,以免“泄漏”任何内存。 这是因为其他this
(获取Activity
实例上下文)指向的Activity
正在被每个用户倾斜手机或离开应用程序等。这显然垃圾收集器(GC)未赶上,因此使用时间销毁内存太多..
但是,任何人都可以拿出一些非常好的代码示例来说明如何使用this
(获取当前Activity
实例的上下文)并且应用程序上下文将是无用/错误的?
getApplicationContext()
几乎总是错误的。 Hackborn女士(等等)已经非常明确,你只能使用getApplicationContext()
当你知道你为什么使用getApplicationContext()
只有当你需要使用getApplicationContext()
直言不讳,“一些程序员”使用getApplicationContext()
(或getBaseContext()
的程度较小),因为他们的Java经验有限。 他们实现一个内部类(例如, OnClickListener
的Button
中的一个Activity
),并需要一个Context
。 而不是使用MyActivity.this
来获得外部类的this
,它们使用getApplicationContext()
或getBaseContext()
来获得一个Context
对象。
当你知道你需要一个Context
时,你只能使用getApplicationContext()
,因为这些东西的寿命可能比任何其他可能的Context
都长。 情景包括:
如果您需要绑定到本身具有全局范围的Context
东西,请使用getApplicationContext()
。 例如,在WakefulIntentService
,我使用getApplicationContext()
来为服务使用静态WakeLock
。 由于WakeLock
是静态的,我需要一个Context
来获取PowerManager
来创建它,所以使用getApplicationContext()
是最安全的。
如果您希望通过onRetainNonConfigurationInstance()
Activity
实例之间的ServiceConnection
(即绑定的句柄),则在从Activity
绑定到Service
时使用getApplicationContext()
onRetainNonConfigurationInstance()
。 Android通过这些ServiceConnections
在内部跟踪绑定,并持有对创建绑定的Contexts
引用。 如果您从Activity
绑定,则新的Activity
实例将引用ServiceConnection
,该ServiceConnection
具有对旧Activity
的隐式引用,并且旧Activity
不能被垃圾收集。
一些开发人员将自定义的Application
子类用于其自己的全局数据,它们通过getApplicationContext()
检索。 这当然是可能的。 我更喜欢静态数据成员,如果没有其他原因,只能有一个自定义Application
对象。 我使用自定义的Application
对象构建了一个应用Application
并发现它很痛苦。 哈克博恩女士也赞同这一立场。
以下是不管使用getApplicationContext()
原因:
这不是一个完整的Context
,支持Activity
所做的一切。 您将尝试使用此Context
各种事情都会失败,主要与GUI有关。
如果来自getApplicationContext()
的Context
持有由您调用创建的东西而您不清除的东西,它可以创建内存泄漏。 通过一个Activity
,如果它持有某种东西,一旦Activity
被垃圾收集,其他的东西也会被刷新。 Application
对象在整个过程中保持不变。
我认为有很多东西在SDK网站上很少记录,这是其中之一。 我要说的是,它似乎更好地默认使用应用程序上下文,并且只在需要时才使用活动上下文。 我见过的唯一需要活动上下文的地方是进度对话框。 SBERG412声称,你必须使用一个活动上下文作为Toast消息,但Android文档清楚地显示了正在使用的应用程序上下文。 由于这个Google示例,我一直使用应用程序上下文进行敬酒。 如果这样做是不对的,那么Google会在这里放下球。
这里有更多想法和评论:
对于Toast消息,Google开发人员指南使用应用程序上下文并明确说出使用它:Toast Notifications
在开发指南的对话框部分,您会看到AlertDialog.Builder使用应用程序上下文,然后进度栏使用活动上下文。 Google没有解释这一点。 对话框
看起来像使用应用程序上下文的一个很好的理由是,当你想要处理配置更改(如方向更改),并且希望保留需要像Views这样的上下文的对象时。 如果你看这里:运行时间变化有一个关于使用活动上下文,它可以创建一个泄漏谨慎。 这可以通过应用程序上下文来避免,并保留视图(至少这是我的理解)。 在我正在编写的应用程序中,我打算使用应用程序上下文,因为我试图在方向更改上保留一些视图和其他内容,而且我仍然希望该活动按方向更改销毁和重新创建。 因此,我必须使用应用程序上下文来避免内存泄漏(请参阅避免内存泄漏)。 对我来说,似乎有很多很好的理由来使用应用程序上下文而不是活动上下文,对我而言,似乎您会比活动上下文更频繁地使用它。 这就是我经历过的许多Android书籍似乎都做的,这就是我见过的大量Google示例。
Google文档确实使得在大多数情况下使用应用程序上下文似乎是完全正常的,事实上它们比在他们的示例中使用活动上下文更经常(至少我见过的例子)。 如果使用应用程序上下文确实存在这样的问题,那么Google真的需要更加重视这一点。 他们需要说清楚,他们需要重做他们的一些例子。 我不会将这完全归咎于没有经验的开发人员,因为权威人士(谷歌)真的使它看起来像使用应用程序上下文不是问题。
我只是使用这个表作为何时使用不同类型的Context的指导,例如Application context (即: getApplicationContext()
)和活动上下文 ,还有BroadcastReceiver上下文 :
原文在这里获取更多信息。
链接地址: http://www.djcxy.com/p/91381.html