在搭建Android開發環境及簡單地建立一個HelloWorld項目后,本篇將通過HelloWorld項目來介紹Android項目的目錄結構。本文的主要主題如下:
1.1、HelloWorld項目的目錄結構(Android 2.1)
1.1、src文件夾
1.2、gen文件夾
1.3、Android 2.1文件夾
1.4、assets
1.5、res文件夾
1.6、AndroidManifest.xml
1.7、default.properties
1.2、HelloWorld項目目錄結構( Android 4.4)

(圖1)
下面將分節介紹上面的各級目錄結構。
Android2.1 介紹
1.1、src文件夾
顧名思義(src, source code)該文件夾是放項目的源代碼的。打開HelloWorld.java文件會看到如下代碼:
package helloworld.test;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
可以看出,我們新建一個簡單的HelloWorld項目,系統為我們生成了一個HelloWorld.java文 件。他導入了兩個類android.app.Activity和android.os.Bundle,HelloWorld類繼承自Activity且重 寫了onCreate方法。
以下說明針對沒有學過Java或者Java基礎薄弱的人
@Override
在重寫父類的onCreate時,在方法前面加上@Override 系統可以幫你檢查方法的正確性。 例如,public void onCreate(Bundle savedInstanceState){…….}這種寫法是正確的, 如果你寫成public void oncreate(Bundle savedInstanceState){…….}這樣編譯器回報如下錯誤—— The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method, 以確保你正確重寫onCreate方法。(因為oncreate應該為onCreate)
而如果你不加@Override,則編譯器將不會檢測出錯誤,而是會認為你新定義了一個方法oncreate。
android.app.Activity類:因為幾乎所有的活動 (activities)都是與用戶交互的,所以Activity類關注創建窗口,你可以用方法setContentView(View)將自己的UI放 到里面。然而活動通常以全屏的方式展示給用戶,也可以以浮動窗口或嵌入在另外一個活動中。有兩個方法是幾乎所有的Activity子類都實現的:
1、onCreate(Bundle): 初始化你的活動(Activity),比如完成一些圖形的繪制。最重要的是,在這個方法里你通常將用布局資源(layout resource)調用setContentView(int)方法定義你的UI,和用findViewById(int)在你的UI中檢索你需要編程地 交互的小部件(widgets)。setContentView指定由哪個文件指定布局(main.xml),可以將這個界面顯示出來,然后我們進行相關 操作,我們的操作會被包裝成為一個意圖,然后這個意圖對應有相關的activity進行處理。
2、onPause():處理當離開你的活動時要做的事情。最重要的是,用戶做的所有改變應該在這里提交(通常ContentProvider保存數據)。
更多的關於Activity類的詳細信息此系列以后的文章將做介紹,如果你想了解更多請參閱相關文檔。
android.os.Bundle 類:從字符串值映射各種可打包的(Parcelable)類型(Bundle單詞就是捆綁的意思,所有這個類很好理解和記憶)。如該類提供了公有方法—— public boolean containKey(String key),如果給定的key包含在Bundle的映射中返回true,否則返回false。該類實現了Parceable和Cloneable接口,所以 它具有這兩者的特性。
1.2、gen文件夾
該 文件夾下面有個R.java文件,R.java是在建立項目時自動生成的,這個文件是只讀模式的,不能更改。R.java文件中定義了一個類——R,R類 中包含很多靜態類,且靜態類的名字都與res中的一個名字對應,即R類定義該項目所有資源的索引。如下代碼片段:
public static final class layout {
public static final int activity_hello=0x7f030000;
public static final int fragment_hello=0x7f030001;
}
通過R.java我們可以很快地查找我們需要的資源,另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進軟件中,這樣可以減少應用在手機占用的空間。
1.3、Android 2.1文件夾
該 文件夾下包含android.jar文件,這是一個Java 歸檔文件,其中包含構建應用程序所需的所有的Android SDK 庫(如Views、Controls)和APIs。通過android.jar將自己的應用程序綁定到Android SDK和Android Emulator,這允許你使用所有Android的庫和包,且使你的應用程序在適當的環境中調試。例如上面的HelloWorld.java源文件中 的:
import android.app.Activity;
import android.os.Bundle;
這里兩行代碼就是從android.jar導入包。
1.4、assets
包含應用系統需要使用到的諸如mp3、視頻類的文件。
1.5、res文件夾
資源目錄,包含你項目中的資源文件並將編譯進應用程序。向此目錄添加資源時,會被R.java自動記錄。新建一個項目,res目錄下會有三個子目錄:drawabel、layout、values。
drawabel-?dpi:包含一些你的應用程序可以用的圖標文件(*.png、*.jpg)
layout:界面布局文件(main.xml)與WEB應用中的HTML類同,沒修改過的main.xml文件如下(HelloWorld的就沒有修改過):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
values:軟件上所需要顯示的各種文字。可以存放多個*.xml文件,還可以存放不同類型的數據。比如arrays.xml、colors.xml、dimens.xml、styles.xml
**
1.6、AndroidManifest.xml
項目的總配置文件,記錄應用中所使用的各種組件。這個文件列出了應用程序所提供的功能,在這個文件中,你可以指定應用程序使用到的服務(如電話服務、互聯網 服務、短信服務、GPS服務等等)。另外當你新添加一個Activity的時候,也需要在這個文件中進行相應配置,只有配置好后,才能調用此 Activity。AndroidManifest.xml將包含如下設置:application permissions、Activities、intent filters等。
HelloWorld項目的AndroidManifest.xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="helloworld.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloWorld"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
關於AndroidManifest.xml現在就講這么多,此系列后面的文章將單獨詳細介紹。
1.7、 default.properties
記錄項目中所需要的環境信息,比如Android的版本等。
HelloWorld的default.properties文件代碼如下所示,代碼中的注釋已經把default.properties解釋得很清楚了:
This file is automatically generated by Android Tools.這個文件是由Android工具自動生成的。
Do not modify this file -- YOUR CHANGES WILL BE ERASED!不要修改這個文件,您的更改將被刪除
This file must be checked in Version Control Systems.這個文件必須簽入版本控制系統。
To customize properties used by the Ant build system use,定制屬性使用Ant構建系統用,"build.properties", and override values to adapt the script to your build.properties,並覆蓋值的腳本適應你的project structure.項目結構Indicates whether an apk should be generated for each density.表示一個apk是否應該為每個生成的密度
split.density=false
Project target.
target=android-7
**
android 4.4
開發一個項目應該對該項目的目錄結構有一個基本的認識,知道每個部分對應的功能及實現。本人學習Android開發便是從這點入手,對項目目錄結構有一個整體的認知。本人使用的是Eclipse作為Android的開發環境,所以就用Eclipse生成的Android項目結目錄構來講。
使用Eclipse生成Android Application Project ,項目名為Application,生成的項目目錄結構如上圖1所示。
可以看到在名為Application(項目名)的文件夾下面有src、gen、Android 4.4、libs等文件夾,每一個文件夾都對應有不同的作用。
其中,src下面放置的是開發人員自己編寫的代碼,具體內容如下
com.example.application是當前項目的包名(package name),里面包含了一個MainActivity.java文件,這個文件是當前整個Android項目運行時的入口,有如C語言的Main方法。
接下來的是gen文件夾,里面的文件是程序自動生成的代碼,不用手動修改。里面有兩個文件:
BuildConfig.java是調試(Debug)時用的,一般不管。
以上的src以及gen可以歸類為源碼區,除了放置程序自動生成的源碼,自己寫的代碼也幾乎是放在src中。
還有Android 4.4及Android Private Library,兩個都是類庫,前者是Android類庫,后者是新的SDK版本才有的,包含了libs下引入的第三方包。
Asset里面放置的是視頻或者MP3音頻等資源文件
Libs放置的是第三方jar包,但最新版本的ADK下會將這些第三方包轉移到Android Private Library里面。
res也是資源文件的放置位置,和Asset最明顯的不同點是res里的資源文件會通過R.java來生成ID,而Asset里的資源文件則不會,具體區別如下:
在很多時候,我們需要訪問android中的資源文件,這些資源文件主要分為兩類,一種出於asset目錄下,稱為原生文件,這類文件在被打包成apk文件時是不會進行壓縮的;另一類則是res下的文件,這類文件在打包成apk文件時,會進行小內存優化的哦。
兩種不同類型的文件,對應着不同的訪問模式。
我們先來看看asset文件的訪問:
android中有一個專門的類來處理應用對asset文件的訪問,這個類就是AssetManager。其內有一個open()方法可以根據用戶提供的文件名,返回一個InputStream對象供用戶使用。
我們截圖看下api中的方法:

這里我們可以看到open方法以及其他的相應方法,對於其中有一個參數accessMode,則指定了系統獲取資源的模式。主要值有以下幾種:

ACCESS_BUFFER :加載文件到內存中,這種方式適合小文件的讀取;
ACCESS_RANDOM:可以隨意的向前或者向后的讀取數據塊
ACCESS_STRAMING:順序的讀取內容
ACCESS_UNKNOWN:當沒有明確指定時,使用默認模式
這里我們一定要注意,open(String fileName)默認的使用ACCESS_STREAMING模式進行讀取!!
那么我們如何獲得一個AssetManager對象呢,在activity中我們可以通過以下的代碼獲取:
AssetManager assetManager = this.getResources().getAsset();
如何訪問res目錄下的文件呢?
我們再activity中可以通過如下方法進行訪問,InputStream inputStream = Resources.openRawResource(int id);
api中是這樣描述的:

在res下面還有幾個比較重要和常見的文件夾:
***drawable-hdpi/drawable-ldpi/drawable-mdpi***:分別放置高、低、中等分辨率的圖片,程序會自動根據運行設備的分辨率更換匹配大小的圖片。
注意:放在這里的圖像資源可能會被aapt工具自動地進行無損壓縮優化。比如,一個真彩色但並不需要256色的PNG可能會被轉換為一個帶調色板的8位PNG。這使得同等質量的圖片占用更少的資源。所以我們得意識到這些放在該目錄下的二進制圖像在生成時可能會發生變化。如果你想讀取一個圖像位流並轉換成一個位圖(bitmap),請把圖像文件放在res/raw/目錄下,這樣可以避免被自動優化。
***layout:***放置布局文件,布局文件是調整制定Activity的窗口布局文件。
***values:***array.xml 定義數組
colors.xml 定義color drawable和顏色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分別獲得這些資源。
dimens.xml定義尺寸值(dimension value)。使用Resources.getDimension()獲得這些資源。
strings.xml定義字符串(string)值。使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字符串上應用的豐富的文本樣式。
styles.xml 定義樣式(style)對象。
*res/raw和assets的相同點:兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進制。
*res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
*讀取文件資源:
1.讀取res/raw下的文件資源,通過以下方式獲取輸入流來進行寫操作
InputStream is = getResources().openRawResource(R.id.filename);
2.讀取assets下的文件資源,通過以下方式獲取輸入流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
關於Res的特點:res:會在R.java文件下生成標記,這里的資源會在運行打包操作的時候判斷哪些被使用到了,沒有被使用到的文件資源是不會打包到安裝包中的。 在res文件夾下其實還可以定義一下目錄: res/anim:這里存放的是動畫資源。 res/xml:可以在Activity中使用getResource().getXML()讀取這里的資源文件 res/raw:該目錄下的文件可以直接復制到設備上,編譯軟件時,這里的數據不需要編譯,直接加入到程序安裝包中,使用方法是getResource().OpenRawResources(ID),其中參數ID的形式是R.raw.XXX.
最后,在項目根目錄下,還有一個AndroidMainfest.xml文件。此文件為配置文件,是對整個項目各種配置及設定的描述。
AndroidMainfest文件的詳細情況: AndroidManfest.xml文件包含了項目中所有使用的Activity、Service、Receiver,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hanfeng.demo"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
【xmlns:android】:包含命名空間的聲明。xmlns:android="http://schemas.android.com/apk/res/androidAndroid中各種標准屬性能夠在文件中使用,提供大部分元素的數據。",使得
【package】:聲明應用程序包。
【application】:包含package中application級別組件聲明的根節點。此元素耶可包含application的一些全局和默認的屬性,如標簽、icon、主題、必要權限等。一個manifest能夠包含零個或一個此元素,不能大於一個。
【android:icon】:應用程序圖標。
【android:label】:應用程序名字。
【Activity】:用戶交互工具。
【android:name】:應用程序默認啟動的Activity。
【intent-filter】:聲明了指定一組組件支持的Intent值,從而形成IntentFilter。
【action】:組件支持的Intent action 。
【category】:組件支持的Intent Category。指定應用程序默認啟動的Activity。
【uses-sdk】: 應用程序所使用的sdk版本。
【android:versionCode】:主要是用於版本升級所用,是INT類型的,第一個版本定義為1,以后遞增,這樣只要判斷該值就能確定是否需要升級,該值不顯示給用戶;其實就是更新的次數。
【android:versionName】:這個是我們常說明的版本號,由三部分組成..,該值是個字符串,可以顯示給用戶。
【uses-feature】 如果你是一個Android用戶,而且你有一個老舊的安裝有android 1.5 的android設備,你可能會注意到一些高版本的應用沒有在手機上的Android Market 中顯示。這必定是應用使用了的結果。
Android Market會根據uses-feature過濾所有你設備不支持的應用。通過使用元素,一個應用可以指定它所支持的硬件型號,舉個例子,有些設備不支持多點觸控或者OpenGL ES 2.0,那么過濾器就會過濾需要這些硬件支持(多點觸控或者OpenGL ES 2.0)的應用,用戶就不會在android market上看到這些應用。
一個元素包含以下屬性:
name屬性指定了應用的特征,required屬性告訴過濾器我們是否在任何情況下必須要需要這個設備的支持,或者僅僅只是“nice to have”。
最后一個屬性是可選擇的,只是用在需要指定一個OpenGL ES版本的時候。
接下來的幾個硬件特征對於游戲開發是非常有用的。
android.hardware.touchscreen.multitouch:它要求設備有一個多點觸控的屏幕以支持基本的多點觸控交互,就如收縮(放大)圖像比例。這些類型的屏幕跟蹤多個手指的能力都有所不同,所以你必須確保這個屏幕的性能是能夠支持的游戲進行。
android.hardware.touchscreen.multitouch.distinct: 這是一個多點觸控的兄弟屬性,它要求提設備供完整的多點觸控功能。
我們將會在接下來的章節片段中看到多點觸控。現在只要記住在當你的游戲需要一個支持多點觸控的屏幕的時候,我們可以使用 元素來剔除所有不支持多點觸控的設備,就像下面這樣:
另外一個在游戲開發中非常有用的是去指定需要的OpenGL ES版本。在本書中,我們只關心OpenGL ES1.0和OpenGL ES1.1就可以了。由於這2者基本上沒有什么不同,所以我們也不用去指定了。然而,有些設備支持更強大的OpenGL ES2.0
如果你的游戲需要更強大的圖形處理能力,我們可以指定OpenGL ES 2.0,然后我們的游戲只會被支持OpenGL ES 2.0的設備所看見。注意,在本書中不會使用OPenGL ES 2.0, 我們只是過濾那些不能提供足夠圖形處理能力的設備。下面顯示了我們怎么去實現它。
它將使我們的游戲只被支持OPenGL ES 2.0 和 假裝有相當的圖形處理能力的設備所看到。
NOTE: 有些設備所反映的性能特征是不正確的,所以開發你的應用的時候盡量去支持各種不同的設備。要謹慎使用。
【supports-screens】
這個元素用於指定應用程序所支持的屏幕尺寸,並針對比應用程序所支持的屏幕還要大屏幕,啟用屏幕兼容模式。在應用程序中使用這個元素指定應用程序所支持的屏幕尺寸是至關重要的。
如果應用程序調整尺寸屬性來填充整個屏幕,那么應用程序就要支持這個給定的尺寸。通常對於大多數應用程序,系統可以很好的完成這種調整工作,並且為了讓應用程序在比一個手持設備大的屏幕上工作,你不需要做任何額外的工作。但是,針對不同的屏幕尺寸,通過提供可選的布局資源來優化應用程序的UI經常是很重要的。例如,一個運行在手持設備上的Activity布局,如果想要運行在平板電腦上,就需要修改這個Activity的布局。
但是,如果為了適應不同的屏幕尺寸而調整了尺寸,但應用程序也不能很好的工作,就可以使用元素的屬性來控制應用程序是否應該發布給屏幕較小的設備,或者使用系統的屏幕兼容模式,讓UI放大以適應較大屏幕的要求。在沒有針對較大屏幕尺寸的設計,並且普通的尺寸不能達到合適結果時,屏幕的兼容模式會通過模擬普通尺寸的屏幕和中等密度來縮放UI,以便它能夠填充整個屏幕,這樣會導致UI模糊,因此針對大屏幕的優化是比較好的。
注意:Android3.2引入了新的屬性:android:requiresSmallestWidthDp、android:compatibleWidthLimitDp和android:largestWidthLimitDp。如果正在開發Android3.2或更高版本的應用程序,應該使用這些屬性來聲明應用程序所支持的屏幕尺寸,而不是基於一般的屏幕尺寸屬性。
屬性(ATTRIBUTES):
android:resizeable
這個屬性用於指示針對不同的屏幕尺寸,應用程序是否可以調整尺寸。默認值是true。如果這個屬性設置了false,在大的屏幕上,系統會在屏幕兼容模式中運行該應用程序。
這個屬性被廢棄了,引入這個屬性主要是為了幫助應用程序從1.5過渡到1.6。當多屏幕支持被引入時,就不應該在使用它了。
android:smallScreens
這個屬性用於指定應用程序是否支持較小外形的屏幕。一個small類型的屏幕被定義成一個比normal(傳統的HVGA)類型的屏幕還要小的屏幕。外部服務(如Google Play)不會把不支持小屏的應用程序提供給小屏設備,因為很少有能夠確保該應用程序在小屏幕的設備上正常工作的平台。這個屬性的默認值是true。
android:normalScreens
這個屬性用於指示應用程序是否支持普通外形的屏幕。典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被認為是普通屏幕。這個屬性的默認值是true。
android:largeScreens
這個屬性用於指示應用程序是否支持較大外形的屏幕。一個large類型的屏幕被定義成一個比normal類型的手持設備的屏幕明顯還要大的屏幕,並且為了讓應用程序能夠良好的使用,使用這個屬性時要特別小心,盡管可以依賴系統來調整尺寸,以便能夠填充屏幕。
這個屬性的默認值實際上在某些版本之間是不同的,因此最好在任何時候都明確的聲明這個屬性。如果設置為false,系統會啟用屏幕兼容模式,這時要格外的小心。
android:xlargeScreens
這個屬性用於指示應用程序是否支持超大外形的屏幕。一個xlarge屏幕被定義成一個比large屏幕還要大的屏幕,如平板電腦,為了能夠讓應用程序良好的使用,需要特別小心的使用這個屬性,盡管可以依賴系統來UI的尺寸來填充屏幕。
android:anyDensity
這個屬性指明應用程序是否包含了能夠適用於任何屏幕密度的資源。
對於支持Android1.6(API Level 4)和更高版本的應用程序,這個屬性的默認值是true,並且除非絕對的確認這是應用程序正常工作所必須的,否則不應該把它設置為false。只是在應用程序直接操作位圖時才需要禁止這個屬性。
android:requiresSmallestWidthDp
這個屬性用於指定smallestWidth的最小需求。smallestWidth是屏幕空間的最短尺寸(以dp為單位),它必須是對應用程序的UI是有效的。也就是說它是有效的屏幕的兩個維度的尺寸中最短的那個。因此為了考慮設備跟應用程序的兼容性,設備的smallestWidth的值必須要大於等於這個屬性所設置的值。通常這個屬性值是針對布局所支持的最小寬度,而不是屏幕當前的方向。
例如,典型的手持設備屏幕smallestWidth是320dp;7英寸的平板電腦的smallestWidth是600dp;10英寸的平板電腦的smallestWidth是720dp。這些值一般都是最小的寬度,因為它們是屏幕可用空間中最短的那個尺寸。
這對這個尺寸值的比較,需要考慮屏幕的裝飾和系統UI部分。例如,如果系統有一些固定的UI元素要顯示,那么系統聲明的設備的最小寬度(smallestWidth)要比實際的屏幕尺寸要小,因為被系統UI占用的屏幕像素對於應用的UI是無效的。因此,這個值應該是應用布局所使用的最小寬度需求,而不管屏幕的當前方向。
如果應用程序能夠針對較小屏幕尺寸進行正確的調整(small尺寸或最小寬度是320dp以下的屏幕),那么就不需要這個屬性。否則就應該使用這個屬性值跟應用程序所使用的最小屏幕寬度限定符的值(swdp)相匹配。
警告:Android系統不會關注這個屬性,因此它不會影響應用程序在運行時的行為。相反,它被服務(如Google Play)用於過濾應用程序。但是,當前Google Play不支持用這個屬性來過濾(在Android3.2上),因此如果應用程序不支持小屏幕設備,就應該繼續使用其他的尺寸屬性。 這個屬性在API Level 13中被引入。
android:compatibleWidthLimitDp
這個屬性允許在設計應用程序時,通過指定最大的“smallest screen width”來啟用屏幕兼容模式,作為一個用戶可選的功能。如果設備的有效屏幕的最小邊比這個屬性值大,那么用戶依然能夠安裝該應用程序,但是在運行時要使用屏幕兼容模式。默認情況下,屏幕兼容模式似乎被禁止的,並且通過會調整布局的尺寸來填充屏幕,但是在系統欄中會有一個按鈕,讓用戶選擇屏幕兼容模式的打開和關閉。
如果應用程序跟所有的屏幕尺寸都兼容,並且它的布局能夠被正確的調整尺寸,就不需要使用這個屬性。
注意:當前,屏幕兼容模式只能模擬320dp寬度的手持設備屏幕,因此如果android:compatibleWidthLimitDp的值比320大,那么屏幕兼容模式就不被適用。
這個在API Level 13中被引入。
android:largestWidthLimitDp
這個屬性允許再設計應用程序時,通過指定最大的“smallest screen width”來強制啟用屏幕兼容模式。如果設備有效屏幕的最小邊比這個屬性值大,應用程序就會運行在屏幕兼容模式中,而用戶沒有辦法禁止這種模式。
如果應用程序跟所有的屏幕尺寸都兼容,並且能夠被正確的調整尺寸,就不需使用這個屬性。否則首先要考慮使用android:compatibleWidthLimitDp屬性。只有在因大屏幕尺寸調整而導致破壞了應用程序的功能的時候,並且使用屏幕兼容模式是唯一的方法的時候,才應該使用這個屬性。
注意:當前,屏幕兼容模式只能模擬320dp寬度的手持設備屏幕,因此如果android:compatibleWidthLimitDp的值比320大,那么屏幕兼容模式就不被適用。
【uses-permission】與【permission】的區別
兩者之間的不同之一就是,作用域不同,在manifest.xml文件中,是和同級的節點,一般是在后面的。但就不痛了,是定義在和之間,和Activity、Service同級別的,同時使用group的權限組可以大幅減少你同類型相似權限的聲明。
可能就是<uses-permission>是官方定義的權限,<permission>是自己定義的權限。
在一般情況下實際上不需要為自己的應用程序聲明某個權限,除非你提供了供其他應用程序調用的代碼或者數據。這個時候你才需要使用這個標簽,很顯然這個標簽可以讓我們聲明自己程序的權限。
【uses-library】
這個元素用於指定該應用程序必須鏈接的共享類庫。這個元素告訴系統該應用程序包的類裝載器中所包含的類庫代碼。
attributes:
android:name
The name of the library. The name is provided by the documentation for the package you are using. An example of this is "android.test.runner", a package that contains Android test classes.
android:required
Boolean value that indicates whether the application requires the library specified by android:name:
"**true**": The application does not function without this library. The system will not allow the application on a device that does not have the library.
"**false**": The application can use the library if present, but is designed to function without it if necessary. The system will allow the application to be installed, even if the library is not present. If you use "false", you are responsible for checking at runtime that the library is available.
To check for a library, you can use reflection to determine if a particular class is available.
**The default is "true".**
【meta-data】
語法(SYNTAX):
被包含於(CONTAINED IN):
說明(DESCRIPTION): 這個元素用name-value對的格式給其父組件提供任意可選的數據。一個組件元素能夠包含任意多個子元素,所有這些元素中定義的值會被收集到一個Bundle對象中,並且提供給組件的PackageItemInfo.metaData屬性字段。 通常值是通過其value屬性來指定的。但是,也可以使用resource屬性來代替,把一個資源ID跟值進行關聯。 例如,下面的代碼就是把存儲在@string/kangaroo資源中的值跟”zoo”名稱進行關聯:
另一個方面,使用resource屬性會給zoo分配一個數字資源ID,而不是保存在資源中的值。例如:
要避免使用多個獨立的實體來提供相關的數據。相反如果有復雜的數據要跟組件關聯,那么把數據作為資源來保存,並使用resource屬性,把相關的資源ID通知給組件。 屬性(ATTRIBUTES): android:name 針對項目的一個唯一名稱。使用Java樣式的命名規則,可以確保名稱的唯一性,例如: com.example.project.activity.fred。 android:resource 這個屬性定義了一個要引用的資源。資源的ID會跟這個項目進行關聯。通過Bundle.getInt()方法能夠從meta-data的Bundle對象中獲取這個ID。 android:value 這個屬性會給這個項目分配一個值。下表列出了可能分配的數據的數據類型,以及獲取這些數據的方法:
類型 Bundle對象方法 字符串。對於一個Unicode字符,要使用雙斜線(\)來進行轉義,如\n和\uxxxx getString() 整數值,如100 getInt() 布爾值,true或false getBoolean() 顏色值,如#rgb、#argb、#rrggbb、#aarrggbb getString() 浮點值,如1.23 getFloat()
1、讀取manifest.xml
PackageManager pm = context.getPackageManager();//context為當前Activity上下文 PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); version = pi.versionName;
2、在里面定義 android:versionName="@string/app_versionName" 然后在 res/values/strings.xml 里定義一個同名 string item :1.1
