1. 程式人生 > >第一個Android的應用程式目錄結構詳說

第一個Android的應用程式目錄結構詳說

http://www.linuxidc.com/Linux/2011-12/48964p2.htm: http://www.linuxidc.com/Linux/2011-12/48964.htm 結構圖:

從上往下一一介紹:

1、  src資料夾一看就是放原始碼的,自己編寫的!!

2、  gen下有跟src中一樣的包檔案,包檔案有一個R.java類,它是自動生成的一個類;該目錄不用我們開發人員維護, 但又非常重要的目錄 。 該目錄用來存放由 Android 開發工具所生成的目錄 。 該目錄下的所有檔案都不是我們建立的,而是由ADT 自動生成的。該目錄下的 R.java 檔案非常重要;

R.java 檔案中預設有 attr 、 drawable 、 layout 、 string 等四個靜態內部類 , 每個靜態

內部類分別對應一種資源, 如 layout 靜態內部類對應layout 中的介面檔案, 其中每個靜態內部類中的靜態常量分別定義一條資源識別符號,如 “ publicstatic final int main =0x7f030000; ” 對應的是 layout 目錄下的 main.xml檔案。具體的對應關係,如下圖。

現在已經理解了 R.java 檔案中內容的來源 , 也即是當開發者在 res/ 目錄中任何一個子目錄中新增相應型別的檔案之後, ADT 會在 R.java 檔案中相應的匿名內部類當中自動生成一條靜態 int 型別的常量,對新增的檔案進行索引。如果在 layout 目錄下在新增一個新的介面,那麼在 public static final class layout 中也會新增相應的靜態 int 常量。相反的 , 當我們再 res 目錄下刪除任何一個檔案 , 其在 R.java 中對應的記錄會被 ADT 自動刪除 。再比如說我們在strings.xml新增一條記錄,在R.java 的 string 內部類中也會自動增加一條記錄。

R.java 檔案會給我們開發程式帶來很大的方便 , 比如在程式中我們使用 “ public staticfinalint icon =0x7f020000; ”就可以找到其對應的 icon.png 這幅圖片。

R.java 檔案除了有自動標識資源的 “ 索引 ” 功能之外 , 還有另一個主要的功能 , 當 re s目錄中的某個資源在應用中沒有被使用到 , 在該應用被編譯的時候系統就不會把對應的資源編譯到該應用的 APK 包中,這樣可以節省 Android 手機的資源。

3、  android 2.1/ 存放 Android 自身的 jar 包。

4、  assets/該目錄用來存放應用中用到的類似於視訊檔案、 MP3 一些媒體檔案。

5、  res/  res 是 resource 的縮寫 。 我們稱該目錄為資源目錄 。該目錄可以存放一些圖示、介面檔案、應用中用到的文字資訊。

res/目錄下有三個 dawable 資料夾 -- drawable-*dpi, 區別只是將圖示按解析度高低來放入不同的目錄 ,drawable-hdpi用來存放高解析度的圖示, drawable-mdpi 用來存放中等解析度的圖示, drawable-ldpi  用來存放低解析度的圖示 。 程式執行時可以根據手機解析度的高低選取相應目錄下的圖示。這些資料夾下放一些png副檔名的圖片,png是透明的壓縮的圖片;專門針對網路製出的圖片,因為它的尺寸很小效果很好!!移動平臺上一般都用png;

如果是老版本的,比如是1.5版本的,res下的drawable只有一個資料夾,過去的版本沒有解析度之分,如果想改變老版本的,所這三個檔案添上就可以了!!

res/目錄下layout/的檔案main.xml是佈局檔案,

main.xml

<? 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 >

我們逐元素進行分析說明:

<LinearLayout> 元素

“LinearLayout ”翻譯成中文是 “ 線性佈局 ” ,所謂線性佈局就是在該元素下的所有子

元素會根據其 “ orientation ” 屬性的值來決定是按行或者是按列逐個顯示。

<TextView > 元素

該元素與 HTML 中的 < label> 元素比較相似。也是一種顯示控制元件。

其屬性 text 指定在該元素上面顯示的文字內容。建議將該文字內容在 strings.xml 檔案;

values/下有一個strings.xml檔案,用來定義字串和數值 , 在 Activity 中使用 getResources().getString(resourceId)或getResources().getText(resourceId) 取得資源。

HelloWorld 專案的 strings.xml 檔案內容如下:

<? xml version = "1.0" encoding = "utf-8"?>

< resources >

< string name = "hello" > Hello World,HelloActivity! </ string >

< string name = "app_name" > Android ,你好! </string >

</ resources >

每個 string 標籤聲明瞭一個字串,name 屬性指定其引用名。

為什麼需要把應用中出現的文字單獨存放在strings.xml 文中呢?

原因有二,一是為了國際化,二是為了減少應用的體積,節省空間;

6、  AndroidManifest.xml: 該檔案是功能清單檔案,該檔案列出了應用中所使用的所有元件; 

AndroidManifest.xml主要包含以下功能:

? 命名應用程式的 Java 應用包,這個包名用來唯一標識應用程式;

? 描述應用程式的元件 -- 活動、服務、廣播接收者、內容提供者;對實現每個元件

和公佈其功能 ( 比如 , 能處理哪些意圖訊息 ) 的類進行命名 。 這些宣告使得 Androi d

系統瞭解這些元件以及它們在什麼條件下可以被啟動;

? 決定應用程式元件執行在哪個程序裡面;

? 宣告應用程式所必須具備的許可權,用以訪問受保護的部分 API ,以及和其它應用程

序互動;

? 宣告應用程式其他的必備許可權,用以元件之間的互動;

? 列舉測試裝置Instrumentation 類,用來提供應用程式執行時所需的環境配置及其

他資訊,這些宣告只在程式開發和測試階段存在,釋出前將被刪除;

? 宣告應用程式所要求的 AndroidAPI 的最低版本級別;

? 列舉application 所需要連結的庫;

AndroidManifest.xml

<? xmlversion = "1.0" encoding = "utf-8" ?>

<manifest xmlns:android = "http://schemas.android.com/apk/res/android"

package ="com.sharpandroid.activity"

android:versionCode= "1"

android:versionName= "1.0" >

<application android:icon = "@drawable/icon"

android:label= "@string/app_name" >

<activity android:name = ".HelloActivity"

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 >

< uses-sdkandroid:minSdkVersion = "7" />

         1. <manifest> 元素

< manifest xmlns:android ="http://schemas.android.com/apk/res/android"

package ="com.sharpandroid.activity"

android:versionCode = "1"

android:versionName = "1.0" >

該元素是 AndroidManifest.xml 檔案的根元素, 該元素為必選 。 其中根據 xml 檔案的語

法, “xmlns:android ”指 定 該 文 件 的 命 名 空 間 。 功 能 清 單 文 件 會 使 用 “http://schemas.android.com/apk/res/android” 所指向的一個檔案 。 “ package ” 屬性是指定 Android 應用所在的包 , 以後會經常說到 “ 應用的包 ” , “ 應用的包 ” 就是指該屬性的內容 。“android:versionCode ”指定應用的版本號。 如果應用需要不斷升級 , 在升級的時候應該修改該值 。 “ android:versionName” 是版本名稱,名稱的取定可根據愛好而定。

2. <application> 元素

< application android:icon ="@drawable/icon"

android:label ="@string/app_name" >

< activity android:name =".HelloActivity"

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 >

<application> 是非常重要的一個元素,今後我們開發的許多元件都會在該元素下定義的。該元素為必選元素。<application> 的“ icon ”屬性是用來設定應用的圖示。該表示式指向的是 icon.png 圖片。 在 Eclipse 中雙擊 icon.png 圖片 , 如下圖 。 對照關係如下圖:

<application> 的 “ label ” 屬性用來設定應用的名稱。指定其屬性值所用的表示式

“ @string/app_name ”含義與上面的表示式“ @drawable/icon ”一樣,同樣是指向 R.jav a檔案中的 string 靜態內部類中的 app_name 屬性所指向的資源。在這裡它指向的是

“ strings.xml ”檔案中的一條記錄“ app_name ”,其值為 “ hello world! ” ,因此,這種表達方式等價於android:label = " hello world ! " 。

兩者結合起來,當程式釋出到模擬器上之後,會在“ 抽屜 ” 中顯示效果,如下。

3. <activity> 元素

<activity> 元素的作用是註冊一個Activity 資訊, 當我們在建立 “ HelloWorld ” 這個項

目時,指定了【 Create Activity 】屬性為“ HelloActivity ”,之後 ADT 在生成專案時幫我們自動建立了一個 Activity 名稱就是“ HelloActivity.java ”, Activity 在 Android 中屬於元件,它需要在功能清單檔案中進行配置。

<activity> 元素的 “ name ” 屬性指定的是該 Activity 的類名 。 我們可以看到這個屬性值“.HelloActivity ”中的 “ . ” , “ . ” 代表的是在上面<manifest> 元素的“ package ”屬性中指定的當前包。因而“ .HelloActivity ”的含義等價於“ com.sharpandroid.activity.HelloActivity.java ” 。如果 Activity 在應用的包中 , 則這個 “ . ” 可以去掉 , 但如果 Activity 不在應用的包中 ,而在應用的包的子包當中,如下圖中的 OtherActivity 這個 Activity 配置時必須這麼寫“ .sub.OhterActivity ”, “ . ” 不可省略。因此建議在書寫時不論何種情況都加上 “ . ” ,以免出錯。

Activity 只能放在 “ 應用的包 ” 或者其子包裡面,而不能在 “ 應用的包 ” 以外的包中 。這一點必須牢記。

4. <intent-filter> 元素

翻譯成中文是“ 意圖過濾器 ” 。首先簡單介紹什麼是意圖( Intent ) 。應用程式的核心元件 ( 活動 、 服務和廣播接收器 ) 通過意圖被啟用 , 意圖代表的是你要做的一件事情 , 代表你的目的 , Android 尋找一個合適的元件來響應這個意圖 , 如果需要會啟動這個元件一個新的例項,並傳遞給這個意圖物件。後面會有詳細的介紹,在此只需有大致印象即可。元件通過意圖過濾器( intent filters )通告它們所具備的功能-- 能響應的意圖型別 。由於 Android 系統在啟動一個元件前必須知道該元件能夠處理哪些意圖 , 那麼意圖過濾器需要在 manifest 中以<intent-filter> 元素指定。 一個元件可以擁有多個過濾器 , 每一個描述該元件所具有的不同能力 。 一個指定目標元件的顯式意圖將會啟用那個指定的元件 , 意圖過濾器不起作用 。 但是一個沒有指定目標的隱式意圖只在它能夠通過元件過濾器任一過濾器時才能啟用該元件。

第一個過濾器--

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

是最常見的。它表明這個 activity 將在應用程式載入器中顯示,就是使用者在裝置上看到的

可供載入的應用程式列表。換句話說,這個 activity 是應用程式的入口,是使用者選擇執行這個應用程式後所見到的第一個 activity 。

5. 許可權 Permissions

Permissions是一個非常重要的節點,Permission是程式碼對裝置上資料的訪問限制,這個限制被引入來保護可能會被誤用頁破壞使用者體驗的關鍵資料和程式碼。如撥號服務,簡訊服務等。每個許可被一個唯的標籤所標識,這個標籤常常指出了受限的動作。

比如:今天做了一個申請拔打電話的服務許可權需要在功能清單檔案中新增如下語句:

<uses-permissionandroid:name="android.permission.CALL_PHONE"/>

下面是一些Android定義的許可權:

一個功能( feature )最多隻能被一個許可權許可保護。如果一個應用程式需要訪問一個

需要特定許可權的功能,它必須在 manifest 元素內使用 <uses-permission> 元素來宣告這一

點。 這樣 , 當應用程式安裝到裝置上之後 , 安裝器可以通過檢查簽署應用程式認證的機構來決定是否授予請求的許可權 , 在某些情況下 , 會詢問使用者 。 如果許可權已被授予 , 那應用程式就能夠訪問受保護的功能特性 。 如果沒有 , 訪問將失敗 , 但不會給使用者任何通知 。 因此我們在使用一些系統服務,如撥號、簡訊、訪問網際網路、訪問 SDCard 時一定要記得新增相應的許可權,否則會出現一些難以預料的錯誤。

7、  / manifest >Procuard.cfg混淆器,就是讓你的程式碼進行加密和壓縮程式碼,java程式碼編譯成class檔案,java程式碼也很規範,有時候程式碼不想讓別人知道,就利用混淆器把原始碼編譯時改了,把那些名字改的亂其八糟的,使人無法閱讀,它會把那些長名字改成a了b了,這樣就減少位元組了壓縮了程式碼!!

8、  Project.properites配置檔案建專案的時候自己就配置了版本資訊

本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連結:http://www.linuxidc.com/Linux/2011-12/48964.htm