系統是怎麼確定最佳資源的?
獲取手機當前的基本配置信息(語言,橫豎屏,屏幕密度,屏幕尺寸等等)
根據這些配置信息,排除apk包中與這些配置信息相矛盾的資源目錄,假設系統語言是cn,那麼所有的其他語言的目錄都會被排除掉,注意系統並不會根據一個dpi的沖突而排除掉含有其他dpi的目錄,dpi這個qualifier非常特殊
按照qualifirer的優先級,依次拿出配置信息中優先級最高的qualifier,去資源目錄中尋找包含這個qualifer的目錄,如果有,排除掉其他目錄,根據配置中下一個優先級的qualifier繼續匹配,如果沒有,接著去拿下一個優先級的qualifier,繼續尋找和排除,直到找到最合適的目錄。
實例
假設我們放置同樣名稱的圖片在如下目錄
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
當前系統的配置為
Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key
匹配過程
首先qualifier的優先級如下,en-GB, port,hdpi,notouch,12key
* 根據en-GB,port,hdpi,notouch,12key這些配置信息,首先排除掉**drawble-fr-rCA目錄,因為fr和en沖突
* 根據第一優先級的en-GB,找到如下三個目錄,drawable-en/,drawable-en-port/,drawable-en-notouch-12key/,排除掉目錄drawable/,drawable-port-ldpi/,drawable-port-notouch-12key/
* 接著獲取下一個優先級的qualifier,port,找到了目drawable-en-port/,排除掉其他目錄,就剩這一個了,那麼就是這個了。
重點
雖然程序會頻繁的獲取資源文件,但是那些與當前配置信息相矛盾的目錄會被永久排除掉,不會每次都去檢查
假設系統根據screen size去尋找最匹配資源的時候,如果沒有找到完全匹配的資源,系統會選擇比當前配置小一點的screen size作為匹配,(例如一個large的屏幕會選擇normal資源,如果找不到large資源的話)假設沒有的話,只有xlarge的資源,系統不會選擇使用這個資源,這個時候就會發生找不到資源的異常了。
資源限定符的優先級比匹配的qualifier多少更重要。例如在上面的例子中,drawable-en-notouch-12key/似乎更加匹配,但是port的優先級更高。
問題
假設匹配了最佳圖片目錄,但是發現目錄裡沒有自己想要的圖片會怎麼樣?
如果是mdpi中沒有圖片,可以去選擇hdpi的目錄裡找尋圖片,然後縮放
如果是large種沒有圖片,可以去normal中找尋圖片
如果layout-port中沒有布局文件,就去layout中找尋布局文件
如果values-cn-hdpi下沒有dimen的話,有待研究