getApplicationContext()几乎总是错误的。Hackborn女士(在其他人中)已经非常明确地指出,只有当您知道为什么要使用getApplicationContext()时才使用getApplicationContext(),并且只有当您需要使用getApplicationContext()时才使用。
坦率地说,“一些程序员”使用getApplicationContext()(或getBaseContext(),在较小的程度上),因为他们的Java经验有限。它们实现了一个内部类(例如,活动中按钮的OnClickListener),并且需要一个Context。而不是使用MyActivity。为了获取外部类的this,他们使用getApplicationContext()或getBaseContext()来获取Context对象。
只有当您知道需要某个上下文的时候,才会使用getApplicationContext(),该上下文可能比您所拥有的任何其他可能存在的上下文都要长。场景包括:
Use getApplicationContext() if you need something tied to a Context that itself will have global scope. I use getApplicationContext(), for example, in WakefulIntentService, for the static WakeLock to be used for the service. Since that WakeLock is static, and I need a Context to get at PowerManager to create it, it is safest to use getApplicationContext().
Use getApplicationContext() when you bind to a Service from an Activity, if you wish to pass the ServiceConnection (i.e., the handle to the binding) between Activity instances via onRetainNonConfigurationInstance(). Android internally tracks bindings via these ServiceConnections and holds references to the Contexts that create the bindings. If you bind from the Activity, then the new Activity instance will have a reference to the ServiceConnection which has an implicit reference to the old Activity, and the old Activity cannot be garbage collected.
一些开发人员为他们自己的全局数据使用Application的自定义子类,他们通过getApplicationContext()检索这些数据。这当然是可能的。我更喜欢静态数据成员,如果没有其他原因,你只能有一个自定义应用程序对象。我使用自定义Application对象构建了一个应用程序,发现它很痛苦。哈克伯恩女士也同意这一观点。
以下是不使用getApplicationContext()的原因:
它不是一个完整的上下文,支持Activity所做的一切。您尝试使用此Context做的各种事情都将失败,主要与GUI有关。
如果getApplicationContext()的Context保留了调用所创建的一些东西,而没有清理,则会造成内存泄漏。对于一个Activity,如果它持有一些东西,一旦该Activity被垃圾收集,其他所有东西也会被清除。Application对象在您的进程的生命周期内保持不变。