在搭建Android開發環境及簡單地創建一個HelloWorld項目後,本篇將經過HelloWorld項目來介紹Android項目的目錄結構。本文的主要主題以下:java
1.一、HelloWorld項目的目錄結構(Android 2.1)android
1.一、src文件夾
1.二、gen文件夾
1.三、Android 2.1文件夾
1.四、assets
1.五、res文件夾
1.六、AndroidManifest.xml
1.七、default.properties編程
1.二、HelloWorld項目目錄結構( Android 4.4)api
(圖1)數組
下面將分節介紹上面的各級目錄結構。app
Android2.1 介紹ide
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子類都實現的:
一、onCreate(Bundle): 初始化你的活動(Activity),好比完成一些圖形的繪製。最重要的是,在這個方法裏你一般將用佈局資源(layout resource)調用setContentView(int)方法定義你的UI,和用findViewById(int)在你的UI中檢索你須要編程地 交互的小部件(widgets)。setContentView指定由哪一個文件指定佈局(main.xml),能夠將這個界面顯示出來,而後咱們進行相關 操做,咱們的操做會被包裝成爲一個意圖,而後這個意圖對應有相關的activity進行處理。
二、onPause():處理當離開你的活動時要作的事情。最重要的是,用戶作的全部改變應該在這裏提交(一般ContentProvider保存數據)。
更多的關於Activity類的詳細信息此係列之後的文章將作介紹,若是你想了解更多請參閱相關文檔。
android.os.Bundle 類:從字符串值映射各類可打包的(Parcelable)類型(Bundle單詞就是捆綁的意思,全部這個類很好理解和記憶)。如該類提供了公有方法—— public boolean containKey(String key),若是給定的key包含在Bundle的映射中返回true,不然返回false。該類實現了Parceable和Cloneable接口,因此 它具備這二者的特性。
1.二、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.三、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.四、assets
包含應用系統須要使用到的諸如mp三、視頻類的文件。
1.五、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.六、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.七、 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.四、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()
一、讀取manifest.xml
PackageManager pm = context.getPackageManager();//context爲當前Activity上下文 PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); version = pi.versionName;
二、在裏面定義 android:versionName="@string/app_versionName" 而後在 res/values/strings.xml 裏定義一個同名 string item :1.1