1. 程式人生 > >ContextWrapper、Context、Activity、ContextThemeWrapper

ContextWrapper、Context、Activity、ContextThemeWrapper

首先我們來看下原始碼中源於Activity的定義:

  1. publicclass Activity extends ContextThemeWrapper  
  2.         implements LayoutInflater.Factory2,  
  3.         Window.Callback, KeyEvent.Callback,  
  4.         OnCreateContextMenuListener, ComponentCallbacks2 {  
  5.     ...  
  6. }  
下面我們來詳細分析每一部分的具體意義:

extends ContextThemeWrapper表示Activity本質上是一個ContextThemeWrapper,而ContextThemeWrapper具體是什麼呢?看ContextThemeWrapper在原始碼中的定義:

  1. publicclass ContextThemeWrapper extends ContextWrapper {  
  2.     ...  
  3. }  

可見ContextThemeWrapper是一個ContextWrapper,繼續往下看:

  1. publicclass ContextWrapper extends Context {  
  2.       Context mBase;  
  3.     ...  
  4. }  

ContextWrapper本質上是一個Context,context 的定義如下:

  1. publicabstractclass Context {  
  2.     ...  
  3. }  

 

Context是一個抽象類,因此可以知道Activity其實就是一個Context,並實現了一些介面,如何理解Context呢?

Context 俗稱上下文,在很多物件定義中我們都用到了Context,例如ImageViewimageView = new ImageView(this); 這裡的this就是當前Activity所在的Context,原始碼中對Context的解釋如下:

Interface to global information about anapplication environment. This is an abstract class whose implementation isprovided by the Android system. It allows access to application-specificresources and classes, as well as up-calls for application-level operationssuch as launching activities, broadcasting and receiving intents, etc.

Context只是一個介面,真正實現Context功能的是ContexImpl類,為了瞭解Context具體有什麼作用,我們先來了解下Context中定義了哪些介面:

  1. publicabstract ComponentNamestartService(Intent service);  
  2. publicabstractboolean stopService(Intentservice);  
  3. publicabstractvoid startActivity(Intentintent);  
  4. publicabstractvoid sendBroadcast(Intentintent);  
  5. publicabstract Intent registerReceiver(BroadcastReceiverreceiver, IntentFilter filter);  
  6. publicabstract Resources getResources();  

ContextWrapper僅僅是對Context的簡單封裝,如果要對Context修改,我們只需要修改ContextWrapper,而不需要對通用的Context進行修改,ContextWrapper的目的僅此而已。而ContextThemeWrapper只是在ContextWrapper的基礎上加入了Theme相關的一些內容,對於Activity來說需要處理一些Theme相關的東西,但是對於Service來說只需繼承ContextWrapper,因為Service不需要處理Theme相關的內容。

分析完extends部分,我們再來看下implements部分,extends決定了Activity的本質,implements部分可以認為是對Activity的擴充套件。

  • LayoutInflater.Factory:通過LayoutInflater來inflate一個layout時的回撥介面
  • Window.Callback: Activity 靠這個接口才有機會對訊息進行處理,這部分涉及到訊息的傳遞,以後將專門介紹。
  • ComponentCallbacks2:定義了記憶體管理的介面,記憶體過低時的回撥和處理處理介面
  • KeyEvent.Callback:鍵盤事件響應的回撥介面,例如onKeyDown()等
  • OnCreateContextMenuListener:上下文選單顯示事件的監聽介面,通過實現該方法來處理上下文選單顯示時的一些操作

通過以上分析,我們大概瞭解了Activity具體是什麼了,這對以後理解Activity應該能帶來一定的幫助。