- Android開發:從0到1 (清華開發者書庫)
- 趙志榮
- 1827字
- 2020-11-28 16:13:33
3.2 And roid工程剖析
工程創建完成之后,需要剖析一下Android工程。
3.2.1 Android工程目錄結構
使用Android Studio工具開發Android應用程序,創建的工程目錄結構比較復雜,開發人員應該清楚各個目錄下面放置的是什么東西。工程根目錄下有app和Gradle Scripts, app是應重點關注的,app下面的主要目錄有manifests、java和res。
manifests目錄中的AndroidManifest.xml是當前Android應用程序的清單文件,記錄應用中所使用的各種組件,java是Java源代碼目錄,res是資源目錄。下面重點介紹一下res目錄。
res資源目錄中存放所有程序中用到的資源文件。“資源文件”指的是布局文件、圖片文件和配置文件等。子目錄主要有drawable、layout、mipmap和values。
? drawable。存放一些應用程序需要用的圖片文件(*.png和*.jpg等)。
? layout。屏幕布局目錄,layout目錄中放置的是布局文件,布局文件是Xml文件。

圖3-8 工程目錄結構
? mipmap。與drawable一樣存放資源圖片,在Android 2.2后增加目錄,Android系統會對mipmap做了一些優化,加快了圖片的渲染速度,提高的圖片質量,減少GPU的壓力。
? values。參數值目錄,存放軟件所需要顯示的各種文字和一些數據。可以在這個目錄下的strings.xml中存放各種文字,還可以存放不同類型的數據,例如colors.xml、dimens.xml和styles.xml等。
另外,為了適配不同的設備,res資源目錄中的drawable、layout、mipmap和values等資源目錄,可以分別有多個,圖3-9是在Windows資源管理器中看到的目錄結構,其中mipmap有5個不同的目錄:

圖3-9 Windows資源管理器目錄結構
? mipmap-mdpi。放置中質量圖片。
? mipmap-hdpi。放置高質量圖片,是mipmap-mdpi尺寸的1.5倍。
? mipmap-xhdpi。放置超高質量圖片,是mipmap-mdpi尺寸的2倍。
? mipmap-xxhdpi。放置超高質量圖片,是mipmap-mdpi尺寸的3倍。
? mipmap-xxxhdpi。放置超高質量圖片,是mipmap-mdpi尺寸的4倍。
3.2.2 R.java文件
訪問res目錄中的資源文件,并不能通過Java IO技術實現,而是通過R.java文件訪問。R.java文件是在工程編譯時候自動產生的R類。
R.java文件可參考如下代碼:
package com.a51work6.helloandroid; public final class R{ … public static final class mipmap{ public static final int ic_launcher=0x7f030000; } public static final class layout{ public static final int activity_main=0x7f030000; } public static final class string{ public static final int app_name=0x7f040001; … } }
R類中包含很多靜態類,且靜態類的名字都與res中的一個目錄名字對應,就像是資源字典大全,包含了用戶界面、圖像、字符串等對應于各個資源的標識符,R類定義了該項目所有資源的索引。例如,在程序代碼中訪問activity_main.xml布局文件,可以通過表達式R. layout.activity_main訪問,示例代碼如下:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
R類還可以訪問界面中的視圖,如果視圖在布局文件中定義id屬性,類似代碼“android:id="@+id/textview"”,那么在程序代碼中就可以通過R.id.textview表達式訪問該視圖。
3.2.3 MainActivity.java文件
Hello Android應用只有一個屏幕,所以只有一個活動類——MainActivity.java文件。MainActivity.java具體代碼如下:
package com.a51work6.helloandroid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
MainActivity是一個活動組件,MainActivity的父類是AppCompatActivity, AppCompatActivity是Activity子類,AppCompatActivity是支持ActionBar的活動類。onCreate方法是在活動組件初始化時候調用方法。setContentView方法是設置活動布局內容,參數是R.layout.activity_main。
3.2.4 activity_main.xml布局文件
布局文件activity_main.xml位于res的layout目錄中,activity_main.xml布局文件代碼如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.a51work6.helloandroid.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World! "/> </RelativeLayout>
RelativeLayout說明當前界面布局是相對布局,TextView聲明一個標簽視圖,具體內容將在后面的章節詳細介紹。界面布局文件activity_main.xml可以使用文本工具打開,Android Studio提供界面設計工具如圖3-10所示,在界面設計工具中可以通過拖曳視圖到設計窗口實現界面設計。

圖3-10 Android Studio提供界面設計工具
提示 在界面設計窗口的左下角有兩個標簽——Design和Text,單擊Text標簽可以切換到Xml文本編輯窗口。
3.2.5 AndroidManifest.xml文件
Android的每個應用都必須包含一個AndroidManifest.xml清單文件,清單文件提供有關當前應用的基本信息,Android系統必須獲得這些信息才能運行該應用。清單文件描述的內容如下:
? 聲明應用的Java源代碼包名,包名非常重要,它是應用的唯一標識符。
? 描述應用中的組件,即Activity(活動)、Service(服務)、Broadcast Receiver(廣播接收器)和Content Provider(內容提供者)。
? 聲明應用必須具備的權限,例如應用中使用到的服務權限(如GPS服務、互聯網服務和短信服務等等)。
? 聲明應用所需的最低Android API級別。
? 聲明應用的安全控制和測試等信息。
注意 在Android Studio工程中,AndroidManifest.xml位于manifests根目錄下;而在操作系統(如Windows的資源管理器)中,AndroidManifest.xml位于應用的根目錄下,圖3-9所示的app/src/main目錄是應用的根目錄。
AndroidManifest.xml文件代碼如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.a51work6.helloandroid"> ① <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" ② android:label="@string/app_name" ③ android:supportsRtl="true" ④ android:theme="@style/AppTheme"> ⑤ <activity android:name=".MainActivity"> ⑥ <intent-filter> <action android:name="android.intent.action.MAIN"/> ⑦ <category android:name="android.intent.category.LAUNCHER"/> ⑧ </intent-filter> </activity> </application> </manifest>
代碼第①行package="com.a51work6.helloandroid"是聲明應用的Java源代碼包名。清單文件中的組件聲明是在標簽application和 /application之間添加的。代碼第②行android:icon="@mipmap/ic_launcher"是設置應用圖標,@mipmap/ic_launcher是引用res/mipmap目錄中的ic_launcher.png圖片文件。代碼第③行android:label="@string/app_name"是聲明應用名,@string/app_name是引用res/values/strings.xml文件中的string name="app_name" /string標簽中的內容。strings.xml代碼如下:
<resources> <string name="app_name" Hello Android /string> </resources>
AndroidManifest.xml文件代碼第④行android:supportsRtl="true"是聲明應用支持從右往左書寫語言習慣(主要是阿拉伯語和希伯來語)。代碼第⑤行是聲明應用主題為AppTheme。
代碼第⑥行聲明活動組件,在活動中可以聲明Intent Filter(意圖過濾器),組件通過意圖過濾器實現響應Intent(意圖), Android系統啟動某個組件之前,需要了解該組件要處理哪些意圖。清單文件中的組件聲明是在標簽intent-filter和 /intent-filter之間添加的,代碼第⑦行和第⑧行是聲明當前活動是主屏幕啟動的活動,即應用啟動的第一個界面。
- Vue.js入門與商城開發實戰
- 深入理解Java7:核心技術與最佳實踐
- Mastering LibGDX Game Development
- 匯編語言程序設計(第3版)
- Visual Basic學習手冊
- JavaScript by Example
- HTML5入門經典
- Django 3.0入門與實踐
- Spring技術內幕:深入解析Spring架構與設計原理(第2版)
- 石墨烯改性塑料
- Lync Server Cookbook
- 打造流暢的Android App
- Mastering Unity 2017 Game Development with C#(Second Edition)
- 小小的Python編程故事
- Python Machine Learning / Second Edition