天天看點

Android學習之Activity源碼的了解(一)

一、Activity為Android系統中四大元件之一,是Android程式的呈現層,并通過界面與使用者進行互動,是以了解Activity源碼是有必要的。

二、之前我寫過一篇文章:http://blog.csdn.net/u012561176/article/details/49924569 這篇文章介紹了如何導入Android的源碼,因為我導入進來了,是以直接就打開檢視了。

三、檢視Activity的源代碼,并找出與它相關的父類:

(1)、Activity類的源碼放在android.app包下,打開Activity.class類,源碼中有很多英文的注釋,注釋可以幫助我們了解,但是我英文不好,看不懂,但是無所謂,可以翻譯,但是我是直接看代碼,源碼中類與類之間的相關性很大,是以大家要耐心點。

(2)、打開後如下圖所示:

Android學習之Activity源碼的了解(一)

之是以我使用截圖,是因為源代碼太多了,附上來估計都暈了,而且我截圖截那麼少,是因為這個類是一個子類,繼承ContextThemeWrapper父類,實作了一些接口,如OnCreateContextMenuListener接口,此接口為建立内容菜單的監聽器。

(3)、由上面一點可以知道Activity是繼承于ContextThemeWrapper父類的,是以此時要打開ContextThemeWrapper類,那我們怎麼知道此類位于哪個包呢?我們可以在Activity.class檔案裡把滑鼠移過去,就知道它是位于哪個包下,此類位于android.view包下,打開此類如下圖所示:

Android學習之Activity源碼的了解(一)

由上圖可知,ContextThemeWrapper類繼承ContextWrapper類。

(4)、由上面一點可知,ContextThemeWrapper類為ContextWrapper類的子類,是以此時就要打開ContextWrapper類,此類位于android.content包下,打開後如下圖所示:

Android學習之Activity源碼的了解(一)

由上圖又可知,ContextWrapper類繼承Context類。

(5)、由上面一點可知,ContextWrapper類為Context類的子類,是以打開Context類,此類也是位于android.content包下,打開後如下圖所示:

Android學習之Activity源碼的了解(一)

由圖可知,此類為一個抽象類,此類用關鍵字abstract聲明了,并且Context類定義了一個或多個抽象的方法,而這些方法隻有方法聲明,沒有方法體。

四、根據Activity的源代碼,我們可以得到這樣一幅圖,來表示類與類之間的關系:

Android學習之Activity源碼的了解(一)

是以可以得出Activity類的祖先是Context類。

比如我們的MainActivity類,繼承Activity類,我們可以在MainActivity類裡面調用Context類的抽象方法和擷取Context類的常量,因為MainActivity繼承Activity類,然後Activity類的祖先又為Context類,是以就可以調用Context類的方法和擷取Context類的常量。

五、此時我們來仔細觀察下Context類的一些代碼:

(1)、Context類的常量定義:

public static final int MODE_PRIVATE = ;
 public static final int MODE_WORLD_READABLE = ;
 public static final int MODE_WORLD_WRITEABLE = ;
 ......
           

還有其它一些常量就不附代碼了,上述代碼中都是通路模式,比如私有的模式,可讀、可寫的模式,其中可讀、可寫的模式已經過時了,并且定義的都為16進制,在代碼實作中可以轉換十進制,比如Context.MODE_PRIVATE可以用0表示。

(2)、Context類無參的抽象方法:

public abstract AssetManager getAssets();
public abstract Resources getResources();
public abstract PackageManager getPackageManager();
public abstract ContentResolver getContentResolver();
......
           

還有一些無參的抽象方法就省略了,其中第一個為獲得Assets目錄的方法,第二個為獲得Resources的方法,就不介紹了,在我們程式設計中常用到的為getResources()方法,用這個方法獲得一個Resources對象,然後利用此對象獲得strings.xml等資源檔案的内容。

(3)、Context類有參的方法、抽象方法:

public final CharSequence getText(int resId) {
        return getResources().getText(resId);
    }
    public final String getString(int resId) {
        return getResources().getString(resId);
    }
    public abstract SharedPreferences getSharedPreferences(String name,
            int mode);
            ......
           

還有一些有參的方法省略了,其中上述的getText(int resId)方法可以擷取到對應控件的文本内容,其中的getSharedPreferences(String name,int mode)方法可以得到一個SharedPreferences對象,能夠儲存資料和共享資料,其中第一個參數為儲存資料的xml檔案名,可不添加字尾,系統預設添加,第二個參數為xml檔案的操作模式,即Context.MODE_PRIVATE等模式。

(4)、其中Contex類中方法實作後的對象類又在其它包下,如Resources類等。是以可以看出類與類之間的聯系是怎樣的。

六、總結:

今天先介紹到這,大家自己可以去看下源碼,了解一下,這篇文章主要介紹如何帶領大家看源碼,然後介紹了Activity的祖先類Context類,并帶着大家看了一下裡面的一些常量和方法。

七、以上内容僅供大家學習參考,此篇文章是我自己了解學習而來的,寫得不好,請見諒,如有錯誤,請指出,謝謝!