Android專案結構分析
作者:阿濤
CSDN博客主頁:https://blog.csdn.net/qq_43313113
文章目錄
- Android專案結構分析
- 一、檔案系統結構
- 1、專案配置清單檔案夾 manifests
- 2、源程式檔案夾Java
- 3、資源程式檔案夾res
- ①布局檔案夾res/layout
- ②值檔案夾res/values
- ③軟體設計的國際化
- ④影像檔案夾res/drawable
- ⑤聲音檔案夾res/raw
- 二、創建多模塊
- 三、Android應用程式的基本組成
- 1、Activity組件與視圖View
- 2、Service組件
- 3、BroadcastReceiver組件
- 4、ContentProvider組件
- 5、Application、Context和Intent
- ①應用物件Application
- ②背景關系物件Context
- ③意圖物件Intent
- 6、Android應用程式的應用入口
- 例:呼叫系統提供的撥號程式
- 四、Android Studio專案除錯
- 1、主動除錯(Toast與Logcat)
- (1)Toast
- (2)Logcat
- 2、動態除錯
- image-20201020203407506
一、檔案系統結構
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單獨進行除錯和安裝,

三、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組件及通信機制如下圖:

③意圖物件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控制臺,找到出錯的原因,

Log是一個Android類,提供了產生不同級別日志資訊,方法有v(string,string)、d(string,string)、i(string,string)、w(string,string)、e(string,string),其中第一個引數是用戶自定義方便篩選的標簽,第二個引數是需要輸出的資訊,
2、動態除錯
在Android Studio環境中,也可以通過設定斷點、檢查變數值的方式來檢查錯誤,適用于程式錯誤的快速精確定位,
單擊某行行號陰影區域即可設定斷點,將產生一個斷點標記,再次點擊可以取消,

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

作者:阿濤
CSDN博客主頁:https://blog.csdn.net/qq_43313113
如有不對的地方,歡迎在評論區指正
歡迎大家關注我,我將持續更新更多的文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186483.html
標籤:其他

