Android開發常常須要使用Context來啓動Activity,或者打開SharedPreferences,或者構建一個Dialog。最近總是用到getContext(),getApplicationContext(),this等,來獲取Context,故寫此文來理清思路。肯定好須要Context的時候,究竟用哪一個函數。app
什麼是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
獲取Context的方法有以下幾種:.net
那麼這幾種獲取Context對象的方式有什麼異同?翻譯
首先將這些方法分類,按照使用的地方分類:orm
在Activity中能夠使用的:對象
在Fragment中能夠使用的:
在View中能夠使用的:
在Activity類中使用this關鍵字,等同於SomeActivity.this。
getApplicationContext() 獲取整個應用的Context,獲取的對象存活週期和應用同樣長。
getContext() View中獲取的是當前活動的Activity,Fragment中返回與之關聯的Context
getActivity() 返回當前Fragment相關聯的Activity
getBaseContext() 獲取ContextWrapper的原始context
無論是Application,仍是Activity,它們都繼承了Context。
由Context引發的內存泄漏主要由兩個緣由:
第一種狀況好理解,當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就行了。