偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android資源管理框架(Asset Manager)簡(jiǎn)要介紹和學(xué)習(xí)

移動(dòng)開發(fā) Android
Android應(yīng)用程序主要由兩部分內(nèi)容組成:代碼和資源。資源主要就是指那些與UI相關(guān)的東西,例如UI布局、字符串和圖片等。代碼和資源分開可以使得 應(yīng)用程序在運(yùn)行時(shí)根據(jù)實(shí)際需要來(lái)組織UI。這樣就可使得應(yīng)用程序只需要編譯一次,就可以支持不同的UI布局。這種特性使得應(yīng)用程序在運(yùn)行時(shí)可以適應(yīng)不同的 屏幕大小和密度,以及不同的國(guó)家和語(yǔ)言等。在本文中,我們就簡(jiǎn)要介紹Android的資源管理框架,以及制定學(xué)習(xí)計(jì)劃。

在軟件開發(fā)中,說(shuō)到代碼與資源分離,最容易想到的可能就是Web開發(fā)了。在Web開發(fā)中,我們一般會(huì)通過(guò)CSS文件來(lái)描述HTML頁(yè)面的展現(xiàn)形式, 也就是通過(guò)CSS來(lái)控制HTML頁(yè)面的UI。這樣就可以很方便地進(jìn)行Web開發(fā)和維護(hù)。例如,當(dāng)我們要更改HTML頁(yè)面的UI時(shí),只要修改相應(yīng)的CSS文 件就可以了。注意,這些CSS文件都是在運(yùn)行時(shí)加載的。這樣我們就可以根據(jù)HTML頁(yè)面的運(yùn)行環(huán)境來(lái)加載不同的CSS文件,例如,根據(jù)不同的地區(qū)或者語(yǔ)言 來(lái)選擇不同的CSS文件,從而實(shí)現(xiàn)國(guó)際化。

再來(lái)看PC客戶端軟件的開發(fā)。開始的時(shí)候,微軟的MFC應(yīng)用程序框架非常流行。在開發(fā)MFC程序的時(shí)候,代碼和資源同樣也是分開的,例如,程序的界面一般 都是通過(guò)一個(gè)RC文件來(lái)描述的。不過(guò)我們一般都是在Visual Studio里面通過(guò)可視化界面來(lái)編輯RC文件的,即一般都不會(huì)直接手動(dòng)去操作RC文件,所以我們一般都不怎么意識(shí)到其實(shí)RC文件和CSS文件一樣,都是 用來(lái)描述程序的界面的。實(shí)際上,RC文件和CSS文件一樣,都是可以看作是一個(gè)界面配置文件,而且它們的配置信息都是通過(guò)文字來(lái)描述的,只不過(guò)這些文字描 述要遵循一定的規(guī)范。

 隨著PC客戶端軟件的發(fā)展,微軟的MFC應(yīng)用程序框架顯得有些力不從心了,其中的一個(gè)原因就是它的界面比較丑陋。如果要對(duì)MFC應(yīng)用程序的UI進(jìn)行美化以 及個(gè)性化的話,是要費(fèi)比較大的勁的,這嚴(yán)重地影響了軟件開發(fā)效率,特別是不適合要進(jìn)行快速迭代開發(fā)的互聯(lián)網(wǎng)客戶端軟件。微軟后來(lái)又開發(fā)了另外一套應(yīng)用程序 開發(fā)框架WPF。WPF同樣是使用一種稱為XAML的文件來(lái)描述應(yīng)用程序的界面的。實(shí)際上,包括現(xiàn)在Win 8的Metro界面,也同樣是通過(guò)XAML文件來(lái)描述應(yīng)用程序界面的。XAML文件是一種XML文件,它具有更好的可讀性,非常方便編輯以及維護(hù)。

在PC客戶端軟件的發(fā)展過(guò)程中,還有一種不得不提的應(yīng)用程序框架——QT。QT最初由Trolltech公司開發(fā),后來(lái)被Nokia收購(gòu)。隨著Meego 的沒(méi)落,如日沖天的Nokia也沒(méi)落了,Qt又被賣給了芬蘭的另外一家IT服務(wù)公司Digia。QT也算得是一套優(yōu)秀的應(yīng)用程序框架,而且它是跨平臺(tái)的。 QT同樣也是通過(guò)一種稱為QML的文件來(lái)描述應(yīng)用程序的界面的,不過(guò)QML文件不是XML格式的,它的格式有點(diǎn)類似Web頁(yè)面的CSS。

類似這種采用XML文件來(lái)描述界面的PC客戶端軟件開發(fā)框架其實(shí)還有很多,例如,迅雷用的Bolt界面引擎,以及騰訊QQ用的GF界面引擎,它們都同樣是通過(guò)XML文件來(lái)描述程序界面的,并且做成代碼和界面描述文件分離。

最后看iOS應(yīng)用程序的開發(fā),它的界面和代碼同樣是分開,并且通過(guò)一種稱為XIB的文件來(lái)描述界面。XIB文件實(shí)際上也是一個(gè)XML文件,因此,它也是非常方便編輯以及維護(hù)的。

從上面的分析就可以看出,無(wú)論是Web應(yīng)用程序,還是PC客戶端應(yīng)用程序,以及移動(dòng)客戶端應(yīng)用程序,它們都無(wú)一例外地將代碼與界面分離,并且界面都是通過(guò)描述性的文字來(lái)描述的,這種描述性的文字越來(lái)越傾向于使用XML格式。

 Android應(yīng)用程序作為一種移動(dòng)客戶端應(yīng)用程序,它同樣也是毫無(wú)意外地將代碼邏輯和界面資源進(jìn)行分離,但是它的資源管理方式與傳統(tǒng)的Web應(yīng)用程序和 PC客戶端應(yīng)用程序以及iOS應(yīng)用程序相比會(huì)更復(fù)雜一些,這是因?yàn)锳ndroid應(yīng)用程序可能會(huì)運(yùn)行在各種大小和密度不等的設(shè)備之上。接下來(lái)我們就將注意 力集中在Android應(yīng)用程序資源的組織和管理之上。

我們首先看Android應(yīng)用程序資源的分類。Android應(yīng)用程序資源可以分為兩大類,分別是assets和res:

1. assets。 assets類資源放在工程根目錄的assets子目錄下,它里面保存的是一些原始的文件,可以以任何方式來(lái)進(jìn)行組織。這些文件最終會(huì)被原裝不動(dòng)地打包在 apk文件中。如果我們要在程序中訪問(wèn)這些文件,那么就需要指定文件名來(lái)訪問(wèn)。例如,假設(shè)在assets目錄下有一個(gè)名稱為filename的文件,那么 就可以使用以下代碼來(lái)訪問(wèn)它:

  1. AssetManager am= getAssets();     
  2. InputStream is = assset.open("filename");   

2. res。res類資源放在工程根目錄的res子目錄下,它里面保存的文件大多數(shù)都會(huì)被編譯,并且都會(huì)被賦予資源ID。這樣我們就可以在程序中通過(guò)ID來(lái)訪問(wèn)res類的資源。res類資源按照不同的用途可以進(jìn)一步劃分為以下9種子類型:

 --animator。這類資源以XML文件保存在res/animator目錄下,用來(lái)描述屬性動(dòng)畫。屬性動(dòng)畫通過(guò)改變對(duì)象的屬性來(lái)實(shí)現(xiàn)動(dòng)畫效果,例如,通過(guò)不斷地修改對(duì)象的坐標(biāo)值來(lái)實(shí)現(xiàn)對(duì)象移動(dòng)動(dòng)畫,又如,通過(guò)不斷地修改對(duì)象的Alpha通道值來(lái)實(shí)現(xiàn)對(duì)象的漸變效果。

--anim。 這類資源以XML文件保存在res/anim目錄下,用來(lái)描述補(bǔ)間動(dòng)畫。補(bǔ)間動(dòng)畫和屬性動(dòng)畫不同,它不是通過(guò)修改對(duì)象的屬性來(lái)實(shí)現(xiàn),而是在對(duì)象的原來(lái)形狀 或者位置的基礎(chǔ)上實(shí)現(xiàn)一個(gè)變換來(lái)得到的,例如,對(duì)對(duì)象施加一個(gè)旋轉(zhuǎn)變換,就可以獲得一個(gè)旋轉(zhuǎn)動(dòng)畫,又如,對(duì)對(duì)象實(shí)施一個(gè)縮放變換,就可以獲得一個(gè)縮放動(dòng) 畫。從數(shù)學(xué)上來(lái)講,就是在對(duì)象的原來(lái)形狀或者位置的基礎(chǔ)上施加一個(gè)變換矩陣來(lái)實(shí)現(xiàn)動(dòng)畫效果。注意,在動(dòng)畫的執(zhí)行過(guò)程中,對(duì)象的屬性是始終保持不變的,我們 看到的只不過(guò)是它的一個(gè)變形副本。

--color。這類資源以 XML文件保存在res/color目錄下,用描述對(duì)象顏色狀態(tài)選擇子。例如,我們可以定義一個(gè)選擇子,規(guī)定一個(gè)對(duì)象在不同狀態(tài)下顯示不同的顏色。對(duì)象的 狀態(tài)可以劃分為pressed、focused、selected、checkable、checked、enabled和window_focused 等7種。

--drawable。這類資源以XML或者Bitmap 文件保存在res/drawable目錄下,用來(lái)描述可繪制對(duì)象。例如,我們可以在里面放置一些圖片(.png, .9.png, .jpg, .gif),來(lái)作為程序界面視圖的背景圖。注意,保存在這個(gè)目錄中的Bitmap文件在打包的過(guò)程中,可能會(huì)被優(yōu)化的。例如,一個(gè)不需要多于256色的真 彩色PNG文件可能會(huì)被轉(zhuǎn)換成一個(gè)只有8位調(diào)色板的PNG面板,這樣就可以無(wú)損地壓縮圖片,以減少圖片所占用的內(nèi)存資源。

--layout。這類資源以XML文件保存在res/layout目錄下,用來(lái)描述應(yīng)用程序界面布局。

--menu。這類資源以XML文件保存在res/menu目錄下,用來(lái)描述應(yīng)用程序菜單,例如,Options Menu、Context Menu和Sub Menu。

--raw。 這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動(dòng)地打包在apk文件中的,不過(guò)它們會(huì)被賦予資源ID, 這樣我們就可以在程序中通過(guò)ID來(lái)訪問(wèn)它們。例如,假設(shè)在res/raw目錄下有一個(gè)名稱為filename的文件,并且它在編譯的過(guò)程,被賦予的資源 ID為R.raw.filename,那么就可以使用以下代碼來(lái)訪問(wèn)它:

  1. Resources res = getResources();   
  2. InputStream is = res .openRawResource(R.raw.filename);   

--values。這類資源以XML文件保存在res/values目錄下,用來(lái)描述一些簡(jiǎn)單值, 例如,數(shù)組、顏色、尺寸、字符串和樣式值等,一般來(lái)說(shuō),這六種不同的值分別保存在名稱為arrays.xml、colors.xml、 dimens.xml、strings.xml和styles.xml文件中。

--xml。這類資源以XML文件保存在res/xml目錄下,一般就是用來(lái)描述應(yīng)用程序的配置信息。

注意,上述9種類型的資源文件,除了raw類型資源,以及Bitmap文件的drawable類型資源之外,其它的資源文件均為文本格式的XML文件,它 們?cè)诖虬倪^(guò)程中,會(huì)被編譯成二進(jìn)制格式的XML文件。這些二進(jìn)制格式的XML文件分別有一個(gè)字符串資源池,用來(lái)保存文件中引用到的每一個(gè)字符串,包括 XML元素標(biāo)簽、屬性名稱、屬性值,以及其它的一切文本值所使用到的字符串。這樣原來(lái)在文本格式的XML文件中的每一個(gè)放置字符串的地方在二進(jìn)制格式的 XML文件中都被替換成一個(gè)索引到字符串資源池的整數(shù)值。這樣做有兩個(gè)好處:

A. 文件占用更小。例如,假設(shè)在原來(lái)的文本格式的XML文件中,有四個(gè)地方使用的都是同一個(gè)字符串,那么在最終編譯出來(lái)的二進(jìn)制格式的XML文件中,字符串資源池只有一份字符串值,而引用它的四個(gè)地方只占用一個(gè)整數(shù)值。

B. 解析速度更快。由于在二進(jìn)制格式的XML文件中,所有的XML元素標(biāo)簽和屬性等值都是使用整數(shù)來(lái)描述的,因此,在解析的過(guò)程中,就不再需要進(jìn)行字符串解析,這樣就可以提高解析速度。

還有另外一個(gè)地方需要注意的是,每一個(gè)res資源在編譯的打包完成之后,都會(huì)被分配一個(gè)資源ID,這些資源ID被終會(huì)被定義為Java常量值,保存在一個(gè) R.java文件中,與應(yīng)用程序的其它源文件一起被編譯到程序中,這樣我們就可以在程序或者資源文件中通過(guò)這些ID常量來(lái)訪問(wèn)指定的資源。

我們接下來(lái)再看應(yīng)用程序資源的組織。應(yīng)用程序資源的組織方式有18個(gè)維度,如圖1所示:

圖1 應(yīng)用程序資源的組織方式

注意,圖1的表格是來(lái)自于官方文檔的,它的詳細(xì)描述可以參考:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources。這里有一點(diǎn)需要說(shuō)明的是,表格中的18個(gè)維度是按照優(yōu)先級(jí)從最大到小排列的,這個(gè)優(yōu)先級(jí)次序可以幫助系統(tǒng)根據(jù)機(jī)器的本地配置來(lái)在應(yīng)用程序資源目錄中找到最合適的資源來(lái)使用。

具體來(lái)說(shuō),Android資源管理框架按照?qǐng)D2所示的算法流程來(lái)在應(yīng)用程序資源目錄中選擇最合適的資源:

圖2 應(yīng)用程序資源的匹配算法

注意,圖2的算法流程圖是來(lái)自于官方文檔的,它的詳細(xì)描述可以參考:http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch。我們同樣是通過(guò)上述官方文檔中的例子來(lái)說(shuō)明上述應(yīng)用程序資源匹配算法的執(zhí)行過(guò)程。

假設(shè)一個(gè)應(yīng)用程序的drawable資源按照以下方式來(lái)組織:

  1. drawable/   
  2. drawable-en/   
  3. drawable-fr-rCA/   
  4. drawable-en-port/   
  5. drawable-en-notouch-12key/   
  6. drawable-port-ldpi/   
  7. drawable-port-notouch-12key/   

并且該應(yīng)用程序所運(yùn)行在的設(shè)置的配置情況如下所示:

  1. Locale = en-GB    
  2. Screen orientation = port    
  3. Screen pixel density = hdpi    
  4. Touchscreen type = notouch    
  5. Primary text input method = 12key   

根據(jù)圖2所示的算法,Android資源管理框架按照以下步驟來(lái)選擇一個(gè)drawable資源:

Step 1. 消除與設(shè)備配置沖突的drawable目錄,即drawable-fr-rCA目錄,因?yàn)樵O(shè)備設(shè)置的語(yǔ)言是en-GB。

  1. drawable/   
  2. drawable-en/   
  3. drawable-en-port/   
  4. drawable-en-notouch-12key/   
  5. drawable-port-ldpi/   
  6. drawable-port-notouch-12key/  

Step 2. 從MMC開始,選擇一個(gè)資源組織維度來(lái)過(guò)渡從Step 1篩選后剩下來(lái)的目錄。

Step 3. 檢查Step 2選擇的維度是否有對(duì)應(yīng)的資源目錄。如果沒(méi)有,就返回到Step 2繼續(xù)處理。如果有,那么就繼續(xù)往下執(zhí)行Step 4。在我們這個(gè)例子中,要一直重復(fù)執(zhí)行Step 2,直到檢查到language這個(gè)維度時(shí)。

Step 4. 消除那些不包含有Step 2所選擇的資源維度的目錄。在我們這個(gè)例子中,就是要消除那些不包含有en這個(gè)language的目錄:

  1. drawable-en/   
  2. drawable-en-port/   
  3. drawable-en-notouch-12key/  

Step 5.  繼續(xù)執(zhí)行Step 2、Step 3和Step 4,直到找到一個(gè)最匹配的資源目錄為止,即剩下最后一個(gè)目錄為止。在我們這個(gè)例子中,下一個(gè)要檢查的維度是screen orienation。由于設(shè)備的screen orienation為port,因此,所有不包含有port資源維度的目錄將被消除:

  1. drawable-en-port/   

最后剩下來(lái)的目錄就只有drawable-en-port,因此,它就是最匹配的資源目錄了,這時(shí)候所有drawable類型的資源都可以從這個(gè)目錄中獲取。

注意,我們?cè)诰幾g和打包應(yīng)用程序資源的過(guò)程中,會(huì)生成一個(gè)resources.arsc文件,這個(gè)文件記錄了所有的應(yīng)用程序資源目錄的信息,包括每一個(gè)資 源名稱、類型、值、ID以及所配置的維度信息。我們可以將這個(gè)resources.arsc文件想象成是一個(gè)資源索引表,這個(gè)資源索引表在給定資源ID和 設(shè)備配置信息的情況下,能夠在應(yīng)用程序的資源目錄中快速地找到最匹配的資源。

最后,我們可以通過(guò)圖3來(lái)總結(jié)應(yīng)用程序資源的編譯、打包以及查找過(guò)程:

圖3 應(yīng)用程序資源的編譯、打包以及查找過(guò)程

通過(guò)圖3我們就可以看出:

A. 除了assets和res/raw資源被原裝不動(dòng)地打包進(jìn)APK之外,其它的資源都會(huì)被編譯或者處理。 

B. 除了assets資源之外,其它的資源都會(huì)被賦予一個(gè)資源ID。

C. 打包工具負(fù)責(zé)編譯和打包資源,編譯完成之后,會(huì)生成一個(gè)resources.arsc文件和一個(gè)R.java,前者保存的是一個(gè)資源索引表,后者定義了各個(gè)資源ID常量。

D. 應(yīng)用程序在運(yùn)行時(shí)通過(guò)AssetManager來(lái)訪問(wèn)資源,或通過(guò)資源ID來(lái)訪問(wèn),或通過(guò)文件名來(lái)訪問(wèn)。

在接下來(lái)的一系列文章中,我們主要關(guān)注以下三個(gè)關(guān)鍵情景:

1. 應(yīng)用程序資源的編譯和打包過(guò)程;

2. 應(yīng)用程序資源的初始化過(guò)程;

3. 應(yīng)用程序資源的查找過(guò)程。

通過(guò)這個(gè)三個(gè)情景,我們基本上就可以了解Android系統(tǒng)的資源管理框架了,敬請(qǐng)關(guān)注。不過(guò)在閱讀這個(gè)系列的文章之前,希望讀者可以先了解一下 Android應(yīng)用程序資源的基礎(chǔ)知識(shí),因?yàn)檫@個(gè)系列的文章不會(huì)陷入到這些基礎(chǔ)知識(shí)中去,具體可以參考以下官方文檔:

責(zé)任編輯:閆佳明 來(lái)源: csdn
相關(guān)推薦

2013-12-03 18:31:43

SDN應(yīng)用編排資源管理

2024-04-26 00:03:00

機(jī)器學(xué)習(xí)人力資源管理

2016-06-17 15:21:43

小米運(yùn)維

2009-06-24 14:18:47

資源管理敏捷項(xiàng)目

2013-12-21 19:58:32

SDN應(yīng)用資源管理平臺(tái)SDN

2021-11-22 16:21:28

Kubernetes 運(yùn)維開源

2023-12-15 15:14:10

yarn任務(wù)管理資源管理

2019-07-03 10:57:03

大數(shù)據(jù)人力資源軟件

2018-09-21 11:10:25

云計(jì)算數(shù)據(jù)中心數(shù)據(jù)驅(qū)動(dòng)

2011-07-28 16:06:34

IOS 應(yīng)用程序 資源

2021-07-19 09:47:37

阿里云Flink 1.12資源管理

2010-01-28 14:54:01

C++資源管理

2009-10-15 08:57:45

Windows 7電源管理

2011-02-22 14:47:52

SQL Server資

2009-03-24 09:05:54

資源管理IT管理廣通信達(dá)

2011-02-28 08:57:10

SQL Server資內(nèi)存性能調(diào)優(yōu)

2016-11-28 10:19:19

云資源濫用開支

2021-09-15 09:00:00

Github工具資源控制管理器

2020-03-02 16:47:42

物聯(lián)網(wǎng)人力資源管理IOT

2023-08-24 16:24:44

TypeScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)