之前對源碼的閱讀,總是用時壹通亂七八糟的跳轉,以學會使用為目的;過了壹段時間,就忘記了,因此打算將壹些源碼的閱讀經歷記錄下來,也通過敲壹遍的過程,加深理解。
最開始,用壹個比較簡單的例子來小試牛刀吧
對於View(Button、TextView等)的點擊事件,常用的寫法是通過 findViewById 獲取View的實例,然後通過 setOnClickListener 設置監聽事件,比如我們有如下Button控件。
設置點擊事件(假設在Activity中)
但是還有壹種寫法是在xml布局中通過android:onClick屬性直接指定點擊執行的函數。
思考
首先我們知道諸如 android:xxx 之類的屬性是會在某個attrs文件中定義的,此處的 android:onClick 是View的屬性,定義在如下文件中。
在View的構造函數中,會解析出此屬性的值。
看這裏, 如果變量handlerName不為空,就會為此View設置點擊事件了 ,這個handlerName就是onClick屬性的值doSubmit,但這個點擊事件,並不是我們所熟悉的OnClickListener。
進壹步看看這個 DeclaredOnClickListener 類
DeclaredOnClickListener 實現了 OnClickListener ,其中重點是參數 mResolvedMethod 和 mResolvedContext 。
在onClick事件中最終通過反射 mResolvedMethod.invoke(mResolvedContext, v); 執行了doSubmit方法。
doSubmit的訪問權限是否可以設置為private呢?
答案:不可以,因為源碼中沒有調用 mMethod.setAccessible(true); 註入所有修飾符。
其實在onClick屬性的註釋中就已經說明了。