Activity是從Context類中派生而來的
Context,中文直譯為“上下文”
- 它描述的是一個應用程序環(huán)境的信息,即上下文
- 該類是一個抽象(abstract class)類微姊,Android提供了該抽象類的具體實現(xiàn)類(后面我們會講到是ContextIml類)
- 通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作分预,例如:啟動一個Activity兢交,發(fā)送廣播,接收Intent信息等
應用程序創(chuàng)建Context實例的情況有如下幾種情況:
- 創(chuàng)建Application對象時笼痹,而且整個App共一個Application對象
- 創(chuàng)建Service對象時
- 創(chuàng)建Activity對象時
因此應用程序App共有的Context數(shù)目公式為:
總Context實例個數(shù)=Service個數(shù)+Activity個數(shù)+1(Application對應的Context實例)
Activity.this獲取的是這個Activity的Context配喳,this.getApplicationContext()獲取的是整個應用程序的Context,這兩者的生命周期是不同的凳干。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog對象是依賴于一個View的晴裹,而View是和一個Activity對應的。
this:代表當前救赐,在Activity當中就是代表當前的Activity涧团,換句話說就是Activity.this在Activity當中可以縮寫為this.
getApplicationContext():生命周期是整個應用,應用摧毀经磅,它才摧毀泌绣。
getApplication():android開發(fā)中共享全局數(shù)據(jù)。
Context類型
Application - 是一個運行在你的應用進程中的單例预厌。在Activity或者Service中阿迈,它可以通過getApplication()函數(shù)獲得,或者人和繼承于context的對象中轧叽,通過getApplicationContext()方法獲得苗沧。不管你是通過何種方法在哪里獲得的刊棕,在一個進程內(nèi),你總是獲得到同一個實例待逞。
Activity/Service - 繼承于ContextWrapper鞠绰,它實現(xiàn)了與context同樣API,但是代理這些方法調(diào)用到內(nèi)部隱藏的Context實例飒焦,即我們所知道的基礎context蜈膨。任何時候當系統(tǒng)創(chuàng)建一個新的Activity或者Service實例的時候,它也創(chuàng)建一個新的ContextImpl實例來做所有的繁重的工作牺荠。每一個Activity和Service以及其對應的基礎context翁巍,對每個實例來說都是唯一的。
BroadcastReciver - 它本身不是context,也沒有context在它里面,但是每當一個新的廣播到達的時候评姨,框架都傳遞一個context對象到onReceive()旅薄。這個context是一個ReceiverRestrictedContext實例,它有兩個主要函數(shù)被禁掉:registerReceiver()和bindService()北专。這兩個函數(shù)在BroadcastReceiver.onReceive()不允許調(diào)用。每次Receiver處理一個廣播,傳遞進來的context都是一個新的實例恰响。
ContentProvider - 它本身也不是一個Context,但是它可以通過getContext()函數(shù)給你一個Context對象涌献。如果ContentProvider是在調(diào)用者的的本地(例如胚宦,在同一個應用進程),getContext()將返回的是Application單例燕垃。然而枢劝,如果調(diào)用這和ContentProvider在不同的進程的時候,它將返回一個新創(chuàng)建的實例代表這個Provider所運行的包卜壕。
保存引用
第一個我們需要解決問題是您旁,在一個對象或者類內(nèi)部保存一個context引用,而它生命周期卻超過其保存引用的對象的生命周期轴捎。例如鹤盒,創(chuàng)建一個自定義的單例,它需要一個context來加載資源或者獲取ContentProvider轮蜕,從而保存一個指向當前Activiy或者Service的引用在單例中昨悼。
View與Context(或Activity)的關系類似于明星與經(jīng)紀人的關系,所以創(chuàng)建View時跃洛,必須明確指定其Context(即經(jīng)紀人或大管家)率触,否則View就成不了明星。
參考