Android Studio 專案目錄、架構與結構

Android Studio 專案目錄、架構與結構您都了解了嗎?本篇文章將詳細解說 Android Studio 應用程式專案的結構,及檔案內程式碼分別所代表的意義。

android-studio-project-directory-structure_00

Android 專案目錄

Android 專案,主要可分為 3 個目錄:

  • manifests:Android APP「整體資訊」的主要設定檔
  • java: Java 原始程式都放在這
  • res:專案所需的「非程式」UI 相關檔案,如 layout、圖像與文字

為了實現 MVC(Model-View-Controller)架構,Android 將 APP 的開發分成二大部分:

  • Model-Controller:程式邏輯
  • View:UI
將「UI」從「程式邏輯」抽離出來,可降低對程式碼的相依性

manifests 目錄

manifests 目錄內有一個預設名稱為 AndroidManifest.xml 的檔案,而每一個 Android APP 都須要它,此檔案儲存著該 APP 的重要資訊。檔名中的 Manifest 為「表明」的意思。

這是一個可以向 Android 「表明」我們 APP 的檔案,以便讓 Android 系統完整地了解我們 APP 的資訊。

APP 的功能清單,有多少 Activity(就是頁面)、服務與可能會存取哪些資料都必須定義在這
Android APP 中會包含許多 XML 格式的檔案,不同用途的檔案,會使用一些標籤(tag)來執行一些設定
手機安裝一個新的 APP,有時會提示須存取某些功能,也是在這定義
app/manifests/AndroidManifest.xml
<!-- 宣告這是一份 XML 文件 -->
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外層一定是 <manifest> 標籤 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	<!-- package 應用程式的完整套件名稱(此名稱也會成為該應用程式的 Application ID)-->
	package="com.example.jacky.myapplication">

    <!-- 應用程式相關設定 -->
    <application
        android:allowBackup="true"
        <!-- 在裝置上的啟動圖示(就是 APP 的 icon),如下參照到 res/mipmap 目錄內的圖像(就是小綠人頭)-->
        android:icon="@mipmap/ic_launcher"
        <!-- 在裝置上的代表名稱,如下參照到 values/strings.xml 檔案內的 app_name 字串 -->
        android:label="@string/app_name"

        android:supportsRtl="true"

        <!-- 指定的佈照主題,如下參照到 values/style.xml -->
        android:theme="@style/AppTheme">

        <activity
            <!-- Activity 名稱,省略套件名稱代表,則套用 <manifest> 標籤的 package 套件名稱 -->
            android:name=".MainActivity"
            <!-- Activity 標題名稱,會在畫面的 ActionBar 上顯示 -->
            android:label="@string/app_name"

            android:theme="@style/AppTheme.NoActionBar">

            <intent-filter>
                <!-- 設定此 Activity 頁面為首頁 -->
                <action android:name="android.intent.action.MAIN" />
                <!-- 應用程式安裝完畢後會自動啟動(未加入該設定,不會自動啟動,必須手動點擊 APP icon 圖示啟動)-->
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

java 目錄

子目錄名稱,就是建立專案時由 Company Domain 反向後,在與 Application name 組成的 Package name,裡面有一個預設的 Activity 元件 MainActivity.java。

app/java/[Package name]/MainActivity.java
package com.example.jacky.myapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

// 繼承自 AppCompatActivity 類別
public class MainActivity extends AppCompatActivity {
    /**
     由於 Activity 是 Android 四大组件,Activity(活動)、Service(服務)、BroadcastReceiver(廣播接收者)與Content Provider(內容提供者)之一
     ,因此必須在功能清單 manifests/AndroidManifest.xml 檔案中進行註冊,方式為:

     <activity android:name="com.example.jacky.myapplication.MainActivity" ......>
     ......
     </activity>
     */
    // Activity 一啟動就會呼叫 onCreate(),而且只會呼叫一次,主要用來完成初始化
    // 覆寫繼承 AppCompatActivity 類別的 onCreate() 方法
    protected void onCreate(Bundle savedInstanceState) {
        // 呼叫父類別 onCreate() 方法
        super.onCreate(savedInstanceState);

        // 將 Activity 到使用者介面設定為 R.layout.activity_main,即 res/layout/activity_main.xml
        // 載入 layout 檔案,當作此頁畫面,就是指定該元件使用畫面的配置資源
        setContentView(R.layout.activity_main);
    }

    // 設定選單,在使用者點擊手機上的選單時觸發,用來彈出選單
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
}

res 目錄

為 resource 的縮寫,專案所需的 UI 相關檔案,也就是非程式的資源,如 layout、圖像與文字。

  • drawable 目錄
    • 圖像檔案資源,例如 png、jpg……圖形檔案
  • layout 目錄
    • UI(使用者介面) 的 layout
  • values 目錄
    • UI 需用到的文字(預設為 strings.xml)、顏色…… 的一些常數資料

layout 目錄

Android 與一般 Java APP 設計方式有很大的不同,尤其在 APP 的資源部份。雖然 Activity 元件是提供一個 APP 的畫面,不過在 MainActivity.java 中你看不到跟畫面相關的程式碼,只有一行指定畫面配置資源的敘述 setContentView(R.layout.activity_main);

app/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- layout 配置 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">
    
    <!-- 目前畫面只有一個文字元件 -->
    <TextView android:text="Hello World!" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</RelativeLayout>

values 目錄

雖然文字可直接寫在 layout 檔案內,但不建議,因翻譯人員只需將文字檔案翻譯即可,無須在 layout 檔案內尋找要翻譯的文字,方便 APP 在地化。

app/res/values/strings.xml
<resources>
    <!-- 應用程式名稱 -->
    <string name="app_name">app_name</string>

    <!-- 自訂文字與名稱-->
    <string name="editTextUser">User Name</string>
</resources>

Android 專案架構與結構

Gradle Scripts 目錄

Gradle 簡單說就是「專案自動化建構工具」。它的應用不僅在 Java 領域,也可和其他語言的開發環境搭配使用。

該目錄儲存與 Gradle 建置系統相關的設定檔,Gradle 是 Android Studio 採用的全新 APP 建置系統。每一個 APP 可以有多個模組(Module),例如一個音樂播放 APP,可以包含行動電話、平板電腦、穿戴式三個模組,每一個模組都可以被建置成一個獨立的 APP。這些重要的資訊儲存在 build.gradle 檔案內。

Gradle Scripts/build.gradle
apply plugin: 'com.android.application'

android {
    // 應用程式模組編譯的版本(Android API Level)
    compileSdkVersion 23
    // Android 建置工具的版本編號
    buildToolsVersion "23.0.1"

    defaultConfig {
        // applicationId 應用程式模組的主套件名稱;就是 app/manifests/AndroidManifest.xml 檔案定義的 package 名稱
        applicationId "com.example.jacky.myapplication"
        // 代表要執行此應用程式最低需要的 API 層級(Level)。API 15 相當於 Android 4.0.3
        minSdkVersion 15
        // 主要版本
        targetSdkVersion 23
        // 自定的應用程式模組版本編號(控管的版本號碼,必須為整數值,不可是字串)
        versionCode 1
        // 自定的應用程式模組版本名稱(對外發佈的版本名稱,值為字串,與上述版本號碼不同)
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

// 設定此應用程式會使用到的函式庫
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

3 則評論 to “Android Studio 專案目錄、架構與結構”

  1. 皓皓 說道:

    Gradle Scripts 目錄
    最後一句話,
    “這些重要的資訊儲存在 buile.gradle 檔案內。"

    發現一個小錯別字
    buile.gradle >> (X)
    build.gradle >> (O)

    講解得滿詳細的! 謝謝!!

  2. 樹葉 說道:

    謝謝! 寫得很詳細也很清楚~

發表迴響