【Android】Context的使用

Android開發常常須要使用Context來啓動Activity,或者打開SharedPreferences,或者構建一個Dialog。最近總是用到getContext(),getApplicationContext(),this等,來獲取Context,故寫此文來理清思路。肯定好須要Context的時候,究竟用哪一個函數。app

Context

什麼是Context呢?ide

我的的理解是:Context就是上下文,換句話說就是運行的環境。它能夠用來新建對象,訪問資源。函數

官方的參考文檔,只有一段:post

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.ui

這麼一段說了3件事情(簡單的翻譯以下):this

  1. 它是獲取應用環境信息的接口。
  2. 它是一個抽象類,實現由安卓系統提供。
  3. 它容許訪問application-specific的資源和類;執行應用級別的操做,好比開啓一個activity。

獲取Context的方法

獲取Context的方法有以下幾種:.net

  1. Activity類中使用this關鍵字
  2. SomeActivity.this
  3. 在Fragment中,能夠getActivity()
  4. getContext()
  5. getApplicationContext()
  6. getBaseContext()

那麼這幾種獲取Context對象的方式有什麼異同?翻譯

首先將這些方法分類,按照使用的地方分類:orm

在Activity中能夠使用的:對象

  1. Activity類中使用this關鍵字
  2. SomeActivity.this
  3. getApplicationContext()
  4. getBaseContext()

在Fragment中能夠使用的:

  1. getContext()
  2. getActivity()

在View中能夠使用的:

  1. getContext()

它們各自的含義

在Activity類中使用this關鍵字,等同於SomeActivity.this。

getApplicationContext() 獲取整個應用的Context,獲取的對象存活週期和應用同樣長。

getContext() View中獲取的是當前活動的Activity,Fragment中返回與之關聯的Context

getActivity() 返回當前Fragment相關聯的Activity

getBaseContext() 獲取ContextWrapper的原始context

無論是Application,仍是Activity,它們都繼承了Context。

避免Context引發的內存泄漏

由Context引發的內存泄漏主要由兩個緣由:

  1. 引用了這個Context的對象存活時間長過傳入的activity。
  2. 成員內部類和匿名內部類隱式持有外部類的對象致使。

第一種狀況好理解,當activity銷燬的時候,還有對象引用了這個activity,那麼GC不會回收這個activity。
第二種狀況的緣由,參見連接4。講的主要是內部類會隱式的持有外部類的對象致使GC不回收這個activity。在安卓中可能發生內存泄漏的地方是,一個activity裏面有一個Runnable的運行還沒結束,這個activity已經銷燬了。可是這個activity被Runnabl隱式地持有,致使activity沒法被回收。

既然如此,那就乾脆不要用this好了!用getApplicationContext()不就行了?

可是,getApplicationContext()有其弊端!

連接3解釋了不用getApplicationContext()的緣由:它不是完整的Context。可能致使一些GUI相關的問題。好比AlertDialog.Builder不能使用getApplicationContext(),由於dialog須要一些主題相關的信息,而Application並不包含這些信息。(You need to use a Theme.AppCompat theme (or descendant) with this activity)

那麼何時用getApplicationContext(),何時用this?
通常而言,若是context不須要ui相關的操做,就用getApplicationContext()。若是對象存活時間可能比activity長,考慮使用getApplicationContext()。其餘狀況,確保activity銷燬前,取消引用activity,用this就行了。

參考連接

  1. https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and#
  2. http://www.javashuo.com/article/p-kokdfyif-er.html
  3. https://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context
  4. http://www.javashuo.com/article/p-suemozbv-kr.html
相關文章
相關標籤/搜索