1.單例對象的類必須保證只有一個實例存在,而且自行實例化並向整個系統提供這個實例
2.使用場景:確保某個類有且只有一個對象的常見,避免產生多個對象消耗過多的資源或者某種類型的對象只應該有且只有一個。
3.實現單例模式主要有如下幾個關鍵點:
①構造函數不對外開放,一般爲private
②通過一個靜態方法或者枚舉返回單例類對象
③確保單例類的對象有且只有一個,尤其是在多線程環境下
④確保單例類對象在反序列化時不會重新構建對象
4.Android源碼中的單例模式
一個Activity的入口是ActivityThread的main函數,在main函數中創建一個新的ActivityThread對象,並且啓動消息循環(UI線程),創建新的Activity,新的Context對象,然後將該Context對象傳遞給Activity。
深入理解LayoutInflater
LayoutInflater是一個抽象類
Activity的SetContentview方法實際上調用的是Window的SetContentView而Windows是一個抽象類,上文提到的Window的具體實現類是PhoneWindow。
Window的View層級圖:
mDecor中會加載一個系統定義好的佈局,這個佈局中有包裹了mContentParent,而這個mContentParent就是我們設置的佈局,並將添加到Parent區域在PhoneWindow的SetContentView方法中也驗證了這點。首先會構建mContentParent這個對象,然後通過LayoutInflater的inflate函數將指定佈局的視圖添加到mContentParent中
inflate方法中,主要有下面幾步:
①解析xml中的跟標籤(第一個元素)
②如果根標籤是merge,那麼調用rInflate進行解析,rInflate會將merge標籤下的所有子View直接添加到根標籤中
③如果標籤是普通元素,調用createViewFromTag對該元素進行解析
④調用rInflate解析temp根元素下的所有子View並且將這些View都添加到temp下
⑤返回解析到的根視圖
單例的優缺點
優點:
①由於單例模式在內存中只有一個實例,減少內存開支,特別是一個對象需要頻繁地創建,銷燬。而且創建或銷燬時性能又無法優化,單例模式的優勢非常明顯。
②由於單例模式只生成一個單例,所以,減少了系統的性能開銷,當一個對象的產生需要比較多的資源時,如讀取配置,產生其他依賴對象時,則可以通過在應用啓動時直接產生一個單例對象,然後用永久駐留內存的方式來解決
③單例模式可以避免對資源的多重佔用,例如一個寫文件操作,由於只有一個實例存在內存中,避免對同一個資源文件的同時寫操作
④單例模式可以在系統設置全局的訪問點,優化和共享資源訪問,例如,可以設計一個單例類,負責所有數據表的映射處理
缺點:
①單例模式一般沒有接口,擴展很困難,若要擴展,除了修改代碼基本沒有第二種途徑可以實現
②單例對象如果持有Context,那麼很容易引發內存泄露,此時需要注意傳遞給單例對象的Context最好是Application Context。