簡介
inflate填充的過程
viewstub,merge,include的載入過程
layoutinflater系統服務的註冊過程
systemserviceregistry類有個靜態**塊,完成了常用服務的註冊,**如下
static});
// 註冊am
registerservice(context.activity_service, activitymanager.class,
new cachedservicefetcher() });
// 註冊wm
registerservice(context.window_service, windowmanager.class,
new cachedservicefetcher() });
// 等等
}
接下來我們看inflate過程,下面是整個inflate過程
public view inflate(xmlpullparser parser, @nullable viewgroup root, boolean attachtoroot)
// 這裡判斷是否是第乙個view節點
if (type != xmlpullparser.start_tag)
final string name = parser.getname();
// 解析merge標籤
if (tag_merge.equals(name))
// 通過rinflate方法將merge標籤下的孩子直接合併到root上,這樣減少一層布局,達到減少viewtree的目的
rinflate(parser, root, inflatercontext, attrs, false);
} else
}// 通過深度遍歷temp下的節點,之後將節點依次新增到剛剛通過反射建立的temp物件上,因為採用的是深度優先遍歷演算法,因此viewtree的層級很深的話,會影響遍歷的效能
rinflatechildren(parser, temp, attrs, true);
// 判斷剛剛建立的temp物件是否新增到父節點上.
// 滿足兩個條件1 父節點(root)不為null,2 attachtoroot=true
if (root != null && attachtoroot)
// 設定result
if (root == null || !attachtoroot)
}} catch (xmlpullparserexception e) catch (exception e) finally
// 返回
return result;
}
總結 原始碼分析之HashMap
首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...
原始碼分析之String
先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...
STL原始碼分析之Vector
地球人都知道vector的查詢效率很高,插入和刪除的效率低下,容器會隨著元素的不斷增加自動增長,最近在看了stl原始碼之後,發現確實是這樣,下面是vector一些關鍵的函式.從這些函式可以看出插入和刪除的過程,以及容器自動增長的方式.兩個通過下標獲取元素的函式.reference operator ...