談談安卓中Context的理解[附思維導圖]

思維導圖是個好東西,可以把知識串在一張圖上,更便於理解記憶。

概述

Context是一個抽象基類。在翻譯爲上下文,也可以理解爲環境,提供一些程序的運行環境基礎信息

子類關係

封裝類ContextWrapper

  • ContextThemeWrapper(帶主題的封裝類)
    • Activity
    • Service
    • Application

實現類ContextImpl

內存泄露問題

  • 靜態資源導致的內存泄漏
    解決方案:避免使用靜態資源,或者使用弱引用來解決相應。
  • 單例模式導致內存泄漏
    解決方案:使用getApplicationContext(),這樣使用單例與Activity就無關了,Activity釋放時則不會出現內存泄露

獲取Context

  • View.getContext()
    返回當前View對象的Context對象,通常是當前正在展示的Activity對象
  • Activity.getApplicationContext()
    獲取當前Activity所在應用進程的Context對象,通常使用Context時,優先考慮全局進程Context
  • ContextWrapper.getBaseContext()
    獲取一個ContextWrapper裝飾之前的Context,在實際開發中使用並不多,不建議使用
  • Activity.this
    返回當前Activity實例,UI控件需要使用Activity作爲Context對象

總結

  • Context共有三種類型,Application、Activity和Service
    整個App共一個Application對象
  • Context數量 = Activity數量 + Service數量 + 1(Application)
  • 三個類都屬於Context,功能是由ContextImpl類去實現的
  • 大多數場景下,三種類型的Context可以通用
  • 特殊場景不可通用(只能使用Activity類型的Context,否則將會出錯)
    • 啓動Activity
      安全考慮,Android不允許Activity或Dialog憑空出現,Activity的啓動必須要建立在另一個Activity的基礎上,以形成返回棧
    • 彈出Dialog
      Dialog則必須在一個Activity上面彈出(除非是System Alert類型的Dialog)

思維導圖

安卓Context的理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章