android內核剖析 Context理解讀書筆記

Context在Android開發中相當重要,也相當常見。

我們在Activity的開發過程當中,在需要用到Context的時候,一般都會使用this,比如在調用getResource的時候,我們其實是this.getResource

在Fragment的開發當中,我們一般需要context的時候,會調用getActivity()

但不同Activity的context得到的resources總是一份相同的


首先讓我們來看看什麼是Context


這裏說了很清楚,context是一個關於應用環境的全局信息。它是一個抽象類,由android系統提供的。

這個抽象類定義了許多許多抽象方法,既然是一個抽象類,它一定有繼承的類


我們可以看到,我們使用的Activity和Service都是context的子類,所以我們的Activity可以當作一個Context來使用

可我們剛纔就發現了,所有Activity的getResource方法都能得到同一個Resource

這時候,讓我們來看以下ContextWrapper這個類


從字面意思講,warrper是外殼的意思

我們看到無論是ContextWarrper的構造方法還是attachBaseContext()方法都有傳入一個base的context

然後它實現的抽象方法都其實是base實現的方法

那麼新的問題又來了Base這個Context是哪來的,它又是幹嗎的?

其實很簡單attachBaseContext()這個方法會傳入一個ContextImpl對象,這個ContextImpl纔是真正的實例化Context對象,contextWapper只是引用了ContextImpl

而ContextImpl中的重要對象PackageInfo又是由Ams傳給本地,所以所有的context都指向同一份PackageInfo

這個也解決了我們之前的問題,得到的resources總是同一份的。

得到了答案,讓我們來看下大致的過程,看下contextImpl是如何賦值給contextWapper的


我們可以看到在創建一個Activity對象之後,創建了一個ContextImpl對象,然後把這個對象通過Activity的attch方法傳給activity對象

然後


activity又調用attchBaseContext方法


其實這裏我有一個不理解的地方,Context mBase這個成員變量在ContextWrapper中已經定義了一邊,然後在ThemeWrapper中又定義了一遍,2個成員變量還都賦值了,不知道爲什麼要這麼設計,望大神解釋下


拋開剛剛的疑問,這種設計是一種很優先的設計思想,輕量級的類實現的方法其實指向的是重量級類對象對應的方法,而輕量級類可以實現多個,但是包含的重量級類卻是同一個,這樣可以幫助節約很大的開銷


發佈了37 篇原創文章 · 獲贊 77 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章