當你接觸java 或者Android的時候,一定會遇到一個名詞——Context。
它是什麼意思呢?
上下文,嗯?
什麼是上下文呢?
嗯——嗯——嗯————
很難說, 腦子好像出現了一片空白。
這說明了 “上下文”給不了你直接的想像空間,它在你心中很孤獨。
金剛說:“如果知識是孤立的,它將毫無魅力可言!”
馬克思也曾說:“世間萬物是普遍聯繫的”。
知識作爲人類對世間萬物認知的概括,它們之間的聯繫遠遠超過你的想像。
現在我們就一起去看一看 Context 在人類知識體系中的關係網,從而感受下Context 到底是個什麼玩意兒。
首先還是回到 Android中的Context,去看一看:它是誰?它可以做什麼?它是怎麼做到的?
在此過程中 我們亦要不斷思考 :現實中有沒有跟Context類似的概念。
now~ let’s do it,go !go! go!
Context是何物?看定義
public abstract class Context {
----靜態常量-----
----抽象方法-----
}
這段代碼是說 Context是一個抽象類。什麼叫抽象類呢?這裏暫不深入討論,只打個比方,動物就是一個抽象類, 它不像貓、狗、人···有具體的形象,“動物” 只是定義了它們的一些共同特徵,比如細胞形態等。
Context亦是如此,它定義了所有Context們所擁有的共同特徵。
接着我們一起看下這些共同特徵是什麼。
啊- 啊-一起觀看太麻煩了,這裏我直接總結下吧:
1) 具備共同的一些靜態常量,比如標誌文件可讀範圍的值、標記服務啓動模式的值等;
2 )調用系統資源 ,獲取res目錄下的圖片 、文字、 顏色 、style 獲取sp等等資源等;
3) 跨進程通信。
其中1) 、2) 都是直接調用資源;3) (跨進程通信)也可以認爲是對系統入口和出口資源的一種調用。
So~ Context的定義的共同特徵就是 —— 能夠調用資源。
想一下,再想一下, 生活中哪個概念表明你擁有調用資源的資格 ....
嗯—— 嗯—— 嗯~嗯.
-----------權力---------
對 , yes,就是權力!
擁有權力的可能是一個機構 、一個人 、一個職位等,但它們有一個共同特徵 ——可調用資源。
你是村長,你就隨便使用村裏的大喇叭;
你是老闆,就盡情佔用着公司的會議室。
冷靜下~
前面我們基本上搞清楚了Context相當於權力,作用是調用資源。在開始瞭解權力是怎麼發揮作用之前,我們先來看一看到底誰是具有權力的,怎麼辨別誰是王,誰是狐狸。
還是回到Android世界中,在這裏我們是神、我們是創造者,我們可以輕而易舉的看到有三類公開的對象繼承自Context,Activity、 Service 、Application,它們是這個虛擬世界中(進程中)的三種權力機構,他們既有類似的權力(由Context定義),也有自己的專屬能力。
一個個來,Activity定義:
public class Activity extends ContextThemeWrapper
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context {
這段代碼意思是 Activity雖然經過多層包裝,但它本質是一個Context。這就好比帝王雖處於巨大的權力光環包裹之中,但他本質依舊是一個人,依然具備人的基本權力。
Application、Service的定義與Activity類似,也是最終繼承一個Context,他們都是特殊的權力機構,咱就略過。
回想下,在Android中,如果其他對象想使用系統資源,比如資源文件夾下下的圖片,一般是怎麼做的呢?
一般是先拿到Activity 、 Application的實例,然後使用這個實例或者他們的Context去調用資源。
你又想到了什麼?借權 ,狐假虎威,這跟現實世界中一樣, 我們如果沒有權力去調動資源,那麼一般做法就是去權力擁有者那裏索要他們的證書、簽名、令牌 ,或者帶上權力擁有者去調動資源。
現實世界中我們並沒有上帝視角,不能看透每個事物的本質,那我們怎麼確定一個人、一個機構到底有沒有我們需要的權力呢?
回到Android世界中,在這裏,一個對象是否有權調動資源 ,看的是它是否能夠用“自己名義" -this去 發起調用。
現實中亦是如此,判斷一個人是不是有權,我們就看他的話好不好使,他的簽名好不好用,他頒發的令牌可不可以調動資源,也可以說是面子夠不夠大。
在社交活動中, 總會聽到類似這樣的話:“看在我面子上,給他批了這塊地”。 其實這是潛意識中去聲明並使用自己的權力,當不給你面子,本質上是權力不被認可或者被冒犯,那就很容易出現爭端、暴力事件。
知道了誰是王,誰是狐狸,繼續我們的話題:
————權力是怎麼發揮作用的————
還是先回到Android世界中,Context是一個抽象類,我們需要到去看看Context具體實現類是怎樣調動資源的。
不管是你去看Activity 、Application 、還是Service都可以就發現他們獲取資源共同調用了
@Override
public Resources getResources() {
return mBase.getResources();
}
這個mBase是一個ContextImpl對象,ContextImpl真正實現了Context的功能,也是就是說要了解Context們的共同權力是如何生效的,我們需要去ContextImpl中探尋。
來看一看ContextImpl
class ContextImpl extends Context {
final @NonNull ActivityThread mMainThread;
private final ApplicationContentResolver mContentResolver;
private final @NonNull ResourcesManager mResourcesManager;
private @NonNull Resources mResources;
private @Nullable Display mDisplay;
@Override
public AssetManager getAssets() {
return getResources().getAssets();
}
@Override
public Resources getResources() {
return mResources;
}
@Override
public Display getDisplay() {
if (mDisplay == null) {
return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY,
mResources);
}
return mDisplay;
}
@Override
public void updateDisplay(int displayId) {
mDisplay = mResourcesManager.getAdjustedDisplay(displayId, mResources);
}
......
由上可以看出ContextImpl是通過引用一個個資源管理對象來完成具體資源的調用,“引用的意思”有兩重 :
1) 你跟這個對象有聯結;
2) 你對這個對象有影響。
所以Context就是通過在一條條與其他對象聯結上施加影響來實現自己的權力, 這其實也是權力的本質
回到現實中,從權力如何發揮作用出發,就不難理解很多看似不合理的社會現象。
當前社會,爲什麼明星、流量主播可以輕而易舉獲取巨大的利益,而大多數勤勤懇懇的科學家、研究員等卻可能在忍受着不公平和窮困?
因爲明星和流量主播具備了權力發生的兩個重要要素——跟大衆的聯結和對大衆的影響,只要加以利用那就可獲取大量的資源。
而大多數的科學家、研究員等人卻沉浸在自己研究中,沒有和廣大民衆建立聯結並提供自己的影響力,自然而然他們不具備大規模調動資源的權力,儘管他們在社會中貢獻很大,但沒有權力就很難直接獲得所需的資源,這時就需要社會和政府進行資源的調配。
分析權力如何發生,也給我們提供了獲取權力的途徑:
一 、構建聯結
二 、提升影響力
我們皆可以通過這種方法不斷提升自己的權力,從而可以調動更多的資源去實現自己的夢想。
現在社會微信 、支付寶、 抖音 等構建了幾乎與每一個人的緊密聯結,一念而發、萬衆所知。這些平臺不僅僅是信息傳播獲取平臺,更是權力運作中心、權力行使平臺,權力可行善,可作惡,藉助於平臺更是可以放大千倍、萬倍、億萬倍,所以國家和人民對他們的監管應該是防微杜漸的、謹小慎微的。
Context——權力——聯結、影響
Context——權力——聯結、影響
回到最初的最初,Context是環境的意思,從前面分析 ,我們知道虛擬世界中的環境不過由一個個聯結實現,我們能從聯結中獲取信息、資源,也可以通過聯結對其他對象施加影響,這一個個聯結是具體的,可感知的。
同樣在現實世界亦是如此,我們所說的自然環境、社會環境不過是由一條條具體的與人、與物的聯結構成,而你能感知到的、能夠影響到的就是你的權力。探測技術的發展、先進工具的使用都是人類嚮往神的力量,在追求更大的權力的征途中不斷前進。
最後的最後我們再一起回顧下:
Context——環境——聯結、感知、影響——權力
Context——環境——聯結、感知、影響——權力