Android項目結構分析
做者:阿濤
CSDN博客主頁:https://blog.csdn.net/qq_43313113
java
1、文件系統結構
一、項目配置清單文件夾 manifests
每一個Android項目都有一個名爲AndroidManifest.xml的文件,包含了Android系統運行前必須掌握的相關信息,如應用程序名稱、圖標、應用程序的包名、組件註冊信息和權限配置等。android
二、源程序文件夾Java
Android以Java做爲編程語言,所以其程序文件以.java做爲擴展名。Java程序文件位於src文件夾的某個包內。編程
三、資源程序文件夾res
在Android項目中,有字符串、位圖、佈局等資源,能夠將其劃分爲三種類型:XML文件、位圖(圖像)文件、raw(聲音)文件。緩存
在Android項目中,有兩個用於存放資源文件的文件夾,分別爲res和assets。其中,res文件夾內的資源文件最終被打包到編譯後的.java文件中,res文件夾內不支持深度的子目錄;assets文件夾中的資源文件不會被編譯,而是直接打包到應用中,assets文件夾支持任意深度的子目錄。res文件夾內的資源文件能夠經過R資源類訪問,而assets文件夾內的資源文件則不能。網絡
①佈局文件夾res/layout
佈局文件夾res/layout用來存放擴展名爲.xml的佈局文件,由某種佈局管理器管理的若干控件對象組成,供Activity組件使用。app
②值文件夾res/values
值文件夾res/values裏的strings.xml是很是重要的文件,一般存放着佈局文件中控件對象的屬性值。框架
③軟件設計的國際化
國際化是指在軟件設計過程當中將特定語言及區域脫鉤的過程,當軟件移植到不一樣的語言及區域時,軟件自己不須要作任何的修改。
Android SDK並無提供給專門的API來實現國際化,而是經過對不一樣的資源文件進行不一樣的命名來達到國際化的目的 。
編程語言
好比控件值來源於文件res/values/strings.xml,經過鍵名hello來引用,就是符合國際化的作法。如在佈局文件中,定義文本框控件的代碼:ide
<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文件夾裏。
2、建立多模塊
在Android Studio開發中,有時但願把多個相關聯的應用集合在一個項目裏,使用Android Studio提供的多模塊功能能夠作到這一點。
在一個已經建立好的項目裏,建立一個新模塊的操做方法是:File→New→New Module。建立New Module的方法與建立項目的步驟基本相同,只是New Module的名稱取代了項目名稱。
建立項目時,自動生成的app實質上就是一個Module,它會調用後來建立的Module。在工具欄裏,能夠選擇不一樣的Module單獨進行調試和安裝。
3、Android應用程序的基本組成
根據Android應用程序的功能,組件可劃分爲四類核心組件:Activity、Service、BroadcastReceiver和ContentProvider。Android四大組件都須要在項目清單文件中使用相關標籤進行註冊。
一、Activity組件與視圖View
Activity負責用戶界面的設計,是Android最重要的組件。Activity用戶界面框架採用MVC模式(Model View Controller)。控制器負責接受並響應程序的外部動做,經過視圖反饋應用程序給用戶的信息(UI界面反饋),模型是應用程序的核心,用於保存數據和代碼。Activity組件在清單文件中使用標籤註冊
二、Service組件
Service是Android提供的無用戶界面、長時間在後臺運行的組件。Android提供了許多系統服務程序。Service組件在清單文件中使用標籤註冊。
三、BroadcastReceiver組件
在Android系統中,當有特定事件發生時就會產生相應的廣播,如開機啓動完成、收到短信、電量改變、網絡狀態改變等。
BroadcastReceiver(廣播接收者)接收來自系統或其餘應用程序的廣播,並作出迴應。BroadcastReceiver沒有UI界面,在清單文件中使用標籤註冊。
四、ContentProvider組件
ContentProvider組件能夠在無須瞭解數據來源、路徑的狀況下,對共享數據進行查詢、添加、刪除和更新等操做。ContentProvider組件在清單文件中使用標籤註冊。
五、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 | 藍牙當前是否可用 |
六、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); } });
4、Android Studio項目調試
一、主動調試(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)。其中第一個參數是用戶自定義方便篩選的標籤,第二個參數是須要輸出的信息。
二、動態調試
在Android Studio環境中,也能夠經過設置斷點、檢查變量值的方式來檢查錯誤,適用於程序錯誤的快速精肯定位。
單擊某行行號陰影區域便可設置斷點,將產生一個斷點標記。再次點擊能夠取消。
點擊工具欄上的爬蟲圖標,將以Debug方式運行程序,在各個斷點處暫停程序運行並顯示內存變量值。單擊向下圖標,能夠以單步方式運行程序。
做者:阿濤
CSDN博客主頁:https://blog.csdn.net/qq_43313113
若有不對的地方,歡迎在評論區指正
歡迎你們關注我,我將持續更新更多的文章