android基礎之Context

Context 背景知識
android 是java編寫的程序,那麼Activity可以直接new出來嗎?顯然答案是不行的。android的應用模型是基於組件的應用模型,組件的運行需要Android的運行環境的,在這個環境下Activity、Service 等組件才能正常運行。Context可以理解位應用程序全局環境的接口,可以通過這個接口來獲取應用程序的類和資源,Context是一個抽象類,android提供了這個抽象類的具體實現。如下圖:
在這裏插入圖片描述
Context兩個子類分工明確,ContextImpl是Context的具體實現類,ContextWrapper是Context的包裝類,其最終的實現還是轉到了ContextImpl來實現的。Application和Service是繼承自ContextWrapper,Activity繼承自ContextThemeWrapper(相比ContextWrapper它可以設置Theme),每次在創建一個Activity Service和Application實例對象的時候都會創建一個ContextImpl對象來負責實際的Context方法的處理。

Activity實現子類
這個問題本身意義並不大,從上面可以看出來,實現的子類主要有三個 Activity Service和Application。

Context能幹什麼
Context是上下文,它是獲取應用環境的接口,因此它能獲取應用程序的資源,例如啓動四大組件,操作數據庫等等。

Context的作用域
Activity作爲Context是一個全能選手能夠支持所有的跳轉創建等操作。
在這裏插入圖片描述
1、如果Show Dialog,只有Activity支持創建這個涉及到窗口的相關知識,Dialog實際是一個子window,必須有一個父window。
2、如果在Application和Service裏面startActivity,由於Application和Service 所生成的Context並沒有Activity棧的相關信息,所以應該新建一個棧,並定義Activity棧爲SingleInstance。
3、Activity使用Layout Inflation,則會帶上設定給Activity的相關主題,Application和Service則沒有。

Context造成內存泄漏
Activity是Context的子類因此,如果內存泄漏會導致Activity一直無法gc。
如何避免呢?
1、當Application能夠滿足的情況下儘量使用Application。
2、不要用生命週期長的對象引用Activity。
3、在Activity不要使用非靜態內部類,非靜態內部類會持有外部類的引用。

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