Android資源知識(一)之Resources概覽

風靈使發表於2018-11-08

資源(Resources)是指應用中的圖片、媒體檔案、字串、顏色值等。Android程式設計師在開發過程中隨時要和Resources打交道,比如R.layout.activity_main@string/hello……

一、Android應用資源的構成

Android系統提供了一套強大的資源管理框架ResourcesAssetManager,下面我們從工程目錄結構來學習下Android應用資源體系的構成,工程目錄結構圖如下:
kinbos工程結構圖.png

從圖中可以看到Android應用資源由兩部分構成:資源目錄和資原始檔

1、資源目錄

資源目錄就是res目錄下的各個子目錄,如anim、drawable、drawable-hdpi、layout、menu、raw、values等。這些目錄都必須是系統預定義的,也就是說像res/drawableres/layout都是合法的,而像res/kinbosres/abcd都不是合法的,系統是識別不了的。無法在R類中生成相應的資料。
    res/anim是存放動畫相關資源的。
    res/drawable是存放圖片資源的。
    res/layout是存放xml佈局檔案的。
    res/menu是存放選單樣式資源的。
    res/raw是存放音訊、視訊等純資料檔案資源的。
    res/values是存放字串、顏色值、陣列等常量定義的檔案的。

2、資原始檔

資原始檔就是資源目錄下的資料檔案,比如.xml、圖片、音視訊檔案等。注意:資原始檔只能放在資源目錄下,而不能放在res目錄下。

二、Android應用程式的編譯步驟

這裡之所以提到Android應用程式的編譯步驟是因為Android對應用資源的處理貫穿了應用的整個開發流程的。下面我們按步驟Properties——>Builders開啟工程的Properties對話方塊,截圖如下:
kinbos編譯步驟.png

Android應用程式的編譯過程主要有以下4個步驟:

1、Android Resource Manager

Android通過aapt工具(aapt工具位於路徑:[sdk目錄]/build-tools/[android-xx])根據res目錄下的資源在R類中生成與之相對應的巢狀子類及static final型常量。R.java檔案程式碼如下:

package com.kinbos.note;

public final class R {
    public static final class anim {
        public static final int abc_fade_in=0x7f040000;
        public static final int abc_fade_out=0x7f040001;
        public static final int abc_slide_in_bottom=0x7f040002;
        public static final int abc_slide_in_top=0x7f040003;
        public static final int abc_slide_out_bottom=0x7f040004;
        public static final int abc_slide_out_top=0x7f040005;
    }
}

從上述程式碼中我們可以看出,res目錄下的子目錄是巢狀子類的類名,如程式碼中的anim,具體的檔名稱是anim類的static final型常量。

2、Android Pre Compiler

這個步驟是將res目錄下的檔案資源編譯成二進位制格式。比如把.xml檔案編譯成二進位制格式。注意:res/raw目錄中的資源除外。

3、Java Builder

.java原始碼編譯成.class檔案,包括R.java

4、Android Package Builder

這個步驟是把.class檔案編譯成.dex格式的檔案。.dex檔案是Dalvik虛擬機器所特有的檔案格式,最後將.dex檔案和其他檔案打包成.apk檔案。

為了更加簡潔清晰的理解Android應用的編譯和打包流程,我們將引用範懷宇著的《Android開發精要》一書裡的一張插圖來說明,如下圖:
在這裡插入圖片描述
kinbos 編譯打包流程.jpg

三、使用Android資源

1、從XML檔案中呼叫資源

語法:@[包名]資源型別 / 資源名稱

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/holo_blue_dark"
        android:text="@string/hello_world" />

2、使用程式碼呼叫資源

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

四、assetsres的區別

1、res目錄中的所有資源都會註冊在R類中,可以通過R類直接呼叫;而assets中的資源則不會被註冊在R類中,所以只能通過檔名引用。

2、assets目錄中的檔案和res/raw不做處理,所以在解壓apk檔案後可以看到原檔案。

相關文章