3、Android專案結構分析

2020-10-21 14:00:35

Android專案結構分析

作者:阿濤
CSDN部落格主頁:https://blog.csdn.net/qq_43313113

一、檔案系統結構

1、專案設定清單資料夾 manifests

每個Android專案都有一個名為AndroidManifest.xml的檔案,包含了Android系統執行前必須掌握的相關資訊,如應用程式名稱、圖示、應用程式的包名、元件註冊資訊和許可權設定等。

2、源程式資料夾Java

Android以Java作為程式語言,因此其程式檔案以.java作為擴充套件名。Java程式檔案位於src資料夾的某個包內。

3、資源程式資料夾res

在Android專案中,有字串、點陣圖、佈局等資源,可以將其劃分為三種型別:XML檔案、點陣圖(影象)檔案、raw(聲音)檔案。

在Android專案中,有兩個用於存放資原始檔的資料夾,分別為res和assets。其中,res資料夾內的資原始檔最終被打包到編譯後的.java檔案中,res資料夾內不支援深度的子目錄;assets資料夾中的資原始檔不會被編譯,而是直接打包到應用中,assets資料夾支援任意深度的子目錄。res資料夾內的資原始檔可以通過R資源類存取,而assets資料夾內的資原始檔則不能。

①佈局資料夾res/layout

佈局資料夾res/layout用來存放擴充套件名為.xml的佈局檔案,由某種佈局管理器管理的若干控制元件物件組成,供Activity元件使用。

②值資料夾res/values

值資料夾res/values裡的strings.xml是非常重要的檔案,通常存放著佈局檔案中控制元件物件的屬性值。

③軟體設計的國際化

國際化是指在軟體設計過程中將特定語言及區域脫鉤的過程,當軟體移植到不同的語言及區域時,軟體本身不需要做任何的修改。
Android SDK並沒有提供給專門的API來實現國際化,而是通過對不同的資原始檔進行不同的命名來達到國際化的目的 。

比如控制元件值來源於檔案res/values/strings.xml,通過鍵名hello來參照,就是符合國際化的做法。如在佈局檔案中,定義文字方塊控制元件的程式碼:

<TextView ...android:text="@string/hello" />

如果不通過參照字串變數的方式,而是直接把字串常數寫在TextView控制元件的android:text屬性後,這種寫法對程式執行沒有任何影響,只是不符合國際化的做法,其程式碼如下:

<TextView ...android:text="字串常數" />

④影象資料夾res/drawable

每個Android應用專案都有一個圖示,預設使用的圖示檔案是ic_launcher是一個綠色的機器人,檔案格式是.xml,存放在資料夾res/mipmap裡。

更改Android應用預設圖示的兩種方法:
(1)右擊mipmap→New→Vector Asset→Clip Art。
(2)先將.png格式的檔案,複製到資料夾res/drawable中,然後通過R檔案參照該影象檔案。

⑤聲音資料夾res/raw

專案使用的音訊檔,通常存放在res/raw資料夾裡。

二、建立多模組

在Android Studio開發中,有時希望把多個相關聯的應用集合在一個專案裡,使用Android Studio提供的多模組功能可以做到這一點。

在一個已經建立好的專案裡,建立一個新模組的操作方法是:File→New→New Module。建立New Module的方法與建立專案的步驟基本相同,只是New Module的名稱取代了專案名稱。

建立專案時,自動生成的app實質上就是一個Module,它會呼叫後來建立的Module。在工具列裡,可以選擇不同的Module單獨進行偵錯和安裝。

image-20201020190807221

三、Android應用程式的基本組成

根據Android應用程式的功能,元件可劃分為四類核心元件:Activity、Service、BroadcastReceiver和ContentProvider。Android四大元件都需要在專案清單檔案中使用相關標籤進行註冊。

1、Activity元件與檢視View

Activity負責使用者介面的設計,是Android最重要的元件。Activity使用者介面框架採用MVC模式(Model View Controller)。控制器負責接受並響應程式的外部動作,通過檢視反饋應用程式給使用者的資訊(UI介面反饋),模型是應用程式的核心,用於儲存資料和程式碼。Activity元件在清單檔案中使用標籤註冊

2、Service元件

Service是Android提供的無使用者介面、長時間在後臺執行的元件。Android提供了許多系統服務程式。Service元件在清單檔案中使用標籤註冊。

3、BroadcastReceiver元件

在Android系統中,當有特定事件發生時就會產生相應的廣播,如開機啟動完成、收到簡訊、電量改變、網路狀態改變等。

BroadcastReceiver(廣播接收者)接收來自系統或其他應用程式的廣播,並做出迴應。BroadcastReceiver沒有UI介面,在清單檔案中使用標籤註冊。

4、ContentProvider元件

ContentProvider元件可以在無須瞭解資料來源、路徑的情況下,對共用資料進行查詢、新增、刪除和更新等操作。ContentProvider元件在清單檔案中使用標籤註冊。

5、Application、Context和Intent

①應用物件Application

當Android程式啟動時系統會建立一個Application型別的物件,用來儲存系統的一些資訊完成資料傳遞、共用和快取等操作。Application物件的生命週期是整個程式中最長的,等於這個程式的生命週期,且是全域性的、單例的,即在不同的Activity和Service中獲得的物件都是同一個物件。

②上下文物件Context

Activity和Service都是Context的子類,通過Context提供的方法getApplicationContext()就能獲得Context物件。通過Intent物件,Activity元件之間可以相互呼叫,實現有引數傳遞或返回值的呼叫。

BroadcastReceiver和ContentProvider並不是Context的子類,其所持有的Context都是由其他元件傳遞過來的。在Activity和Service元件裡傳送廣播,均需要使用Intent物件。

Android元件及通訊機制如下圖:

image-20201020194048544

③意圖物件Intent

Intent是一種輕量級的程序間通訊機制,讓跨行程群元件通訊和傳送系統廣播成為可能,元件Activity、Service和BroadcastReceiver都是通過訊息機制被啟動(啟用)的,其使用的訊息就封裝在物件Intent裡。

Content是一個抽象類且是Activity的超類,提供了startActivity()方法,並以Intent物件作為引數,用於實現表單的跳轉。

在Android中,呼叫其他應用的動作名稱由眾多的類提供,也可以自定義。Android系統提供的常用意圖動作名稱如下表:

方法名功能描述
Intent.ACTION_MAIN標識Activity為一個程式的開始,參見清單檔案中對主Activity的定義
Intent.ACTION_DIAL呼叫系統提供的撥號程式
Intent.ACTION_CALL呼叫指定的電話
Intent.ACTION_SENDTO傳簡訊、E-Mail等
Intent.ACTION_VIEW瀏覽網頁、地圖、播放多媒體等
Intent.ACTION_WEB_SEARCH網路搜尋
Intent.ACTION_BATTERY_CHANGED檢查手機電量情況
Intent.ACTION_REQUEST_ENABLE藍芽當前是否可用

6、Android應用程式的應用入口

在一個Android應用程式開始執行的時候,會單獨啟動一個程序(Process)。預設情況下,這個應用程式的所有元件都會執行在這個程序裡。

一個Android應用程式通常由多個Activity組成,但只有一個主Activity。在專案清單檔案中使用標籤註冊主Activity時,還需要內嵌、和標籤,以此說明該Activity為應用程式的入口。以下程式碼是定義一個MainActivity.java為應用的主Activity程式碼:

<activity 
	android:name="packname.MainActivity"
    android:label="@string/app_name">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

例:呼叫系統提供的撥號程式

系統撥號程式可以理解為系統預先定義的一個Activity,通過Intent物件去啟用,步驟如下:
(1)在專案的佈局檔案裡,新增一個名為call_btn的Button控制元件
(2)在MainActivity程式的onCreate()方法裡,新增如下程式碼:

//先找控制元件,後設定監聽器(使用匿名內部類建立監聽器物件)
findViewById(R.id.call_btn).setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        //建立意圖物件
        Intent intent = new Intent();
        //呼叫系統的介面程式
        intent.setAction(Intent.ACTION_VIEW);
        //intent.setAction(Intent.ACTION_DIAL); //呼叫系統的撥號程式
        //根據資料型別開啟相應的Activity(撥號程式)
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }
});

四、Android Studio專案偵錯

1、主動偵錯(Toast與Logcat)

(1)Toast

android.weiget.Toast類用於實現訊息提醒,其資訊在顯示幾秒後自動消失,只能以程式程式碼的方式設計。

Toast的靜態方法makeText(Context,CharSequence,int)用於建立一個Toast物件,三個引數分別為:
①上下文物件,表示在哪個Activity裡顯示
②要顯示的字串資訊
③顯示的時長,可使用類常數Toast.LENGTH_LONG或Toast.LENGTH_SHORT,也可使用以毫秒為單位的正整數

通常先使用makeText()方法建立一個Toast物件,再使用show()方法顯示某個Activity。在使用show()前,可以使用setGravity(int,int,int)方法設定顯示位置,如果不設定,則預設出現在手機螢幕偏下的位置。

Toast.makeText(this,"顯示資訊",Toast.LENGTH_LONG).show(); //this表示當前Activity的上下文

(2)Logcat

Android系統執行應用程式時會產生一些紀錄檔(Log)資訊,按照級別從低到高的順序劃分為Verbose(詳細)、Debug(偵錯)、Information(資訊)、Warning(警告)和Error(錯誤)等不同級別。

如果Android程式執行時閃退,則表明程式遇到了致命的錯誤。開啟Logcat控制檯,選擇紀錄檔級別為Error,可獲取錯誤資訊。也可以通過檢視Run控制檯,找到出錯的原因。

image-20201020202527892

Log是一個Android類,提供了產生不同級別紀錄檔資訊,方法有v(string,string)、d(string,string)、i(string,string)、w(string,string)、e(string,string)。其中第一個引數是使用者自定義方便篩選的標籤,第二個引數是需要輸出的資訊。

2、動態偵錯

在Android Studio環境中,也可以通過設定斷點、檢查變數值的方式來檢查錯誤,適用於程式錯誤的快速精確定位。

單擊某行行號陰影區域即可設定斷點,將產生一個斷點標記。再次點選可以取消。

image-20201020203141160

點選工具列上的爬蟲圖示,將以Debug方式執行程式,在各個斷點處暫停程式執行並顯示記憶體變數值。單擊向下圖示,可以以單步方式執行程式。

image-20201020203339781

image-20201020203407506

作者:阿濤
CSDN部落格主頁:https://blog.csdn.net/qq_43313113
如有不對的地方,歡迎在評論區指正
歡迎大家關注我,我將持續更新更多的文章