思維導圖是個好東西,可以把知識串在一張圖上,更便於理解記憶。
概述
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)
- 啓動Activity