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

Android Studio

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

Android 專案目錄

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

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

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

  • Model-Controller:程式邏輯
  • View:UI

manifests 目錄

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

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

AndroidManifest.xml:

  • 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 在地化。

<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 檔案內。

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'
} 

參考

在〈Android Studio 專案目錄、架構與結構〉中有 4 則留言

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

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

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

發表留言