- Android經典應用
- 趙書蘭編著
- 1393字
- 2018-12-30 05:22:49
1.6 Android程序結構分析
在前面已經完成一個最簡單的Android手機程序開發,并且在模擬器上運行通過。但是,大家腦海中一定存在很多疑問,Android程序是怎樣組織、如何運行的呢?
下面根據前面創建的HelloWorld來分析一下Android應用程序的結構。雖然這個例子簡單,也沒有寫任何代碼,但是 “麻省雖小,五臟俱全”,可以從中對Android應用程序有一個整體的認識。
在Eclipse集成開發環境的“包資源管理器”中,展開“HelloWorld”項目,如圖1-36所示。
● src目錄:源文件文件夾。
● gen目錄:保存自動生成的R資源索引類文件夾。
● assets目錄:保存原始資源類文件的文件夾。
● res目錄:資源文件夾。
● AndroidManifest.xml文件:Android應用程序的配置清單文件。
這些目錄和文件構成了Android智能手機程序的框架。下面分別介紹各個部分的含義和作用。
1.6.1 src目錄
在src目錄下包含了應用程序的源文件,這里為MainActivity.java文件,打開該文件,其代碼為:
package com.example.e1; //包名稱 import android.os.Bundle; import android.app.Activity; //導入Android程序包 import android.view.Menu; public class MainActivity extends Activity //MainActivity類 { @Override public void onCreate(Bundle savedInstanceState) //重載onCreate { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) //創建菜單 { getMenuInflater().inflate(R.menu.main, menu); return true; } }
在以上代碼中,創建了一個MainActivity類,其繼承了Activity類,也就是說MainActivity類是Activity的子類。在此,重載了onCreate方法。在onCreate方法中,首先調用父類構造應運,然后調用onCreateOptionsMenu方法來創建菜單項。
1.6.2 gen目錄
在gen目錄下包含了自動生成的R資源索引文件,這里為R.java。打開該文件,其代碼為:
//這個類的數據資源是自動生成的,不可手動修改 package com.example.e1; //包名稱 public final class R { public static final class attr //R資源索引類 { } public static final class drawable{ //圖片屬性 public static final int ic_action_search=0x7f020000; public static final int ic_launcher=0x7f020001; } public static final class id { public static final int menu_settings=0x7f070000; } public static final class layout{ //布局文件 public static final int main=0x7f030000; } public static final class menu{ //菜單 public static final int main=0x7f060000; } public static final class string{ //字符串 public static final int app_name=0x7f040000; public static final int hello_world=0x7f040001; public static final int menu_settings=0x7f040002; public static final int title_activity_main=0x7f040003; } public static final class style{ //類型 public static final int AppTheme=0x7f050000; } }
這里的R.java文件為只讀模式,由Eclipse自動添加修改,用戶無須進行修改。仔細觀察該文件,這里相當于定義了很多不同類型的常量,包括屬性、圖片、布局文件和字符串。這些常量名稱與res文件夾中的文件名完全相同。也就是說,R.java文件中的常量是該項目中res文件夾中所有資源的索引。通過這些索引,Android程序可以很快地引用這些資源。
1.6.3 res目錄和assets目錄
在res目錄下包含了該項目所使用到的資源文件,這里面的每一個文件或者資源都將在R.java文件中進行索引定義。主要包括如下幾類。
● 圖片文件:分別提供了高分辨率(drawable-hdpi)、中分辨率(darawable-mdpi)和低分辨率(drawable-ldpi)的圖片文件。
● 布局文件:在layout目錄下,默認只有一個main.xml文件,用戶也可以添加更多的布局文件。
● 字符串:在value目錄下的strings.xml文件中。
打開main.xml布局文件,代碼如下:
<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" > <TextView //文本框控件 android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" //顯示內容 tools:context=".MainActivity" /> </RelativeLayout>
在該布局文件中,首先定義了采用相對布局,內部只有一個文本框控件。這個控件顯示的內容引用了string文件中的hello_world變量。因此,再看一下strings.xml文件,代碼如下:
<resources> <string name="app_name">E1</string> <string name="hello_world">Hello world!</string> //hello_world字符串 <string name="menu_settings">Settings</string> //title_activity_main字符串 <string name="title_activity_main">MainActivity</string> </resources>
這里定義了兩個字符串,hello字符串的內容為“Hello world!”,這正是該程序運行界面上顯示的內容;menu_settings字符串的內容為“MainActivity”,這正是該程序的標題上顯示的內容。
assets目錄同樣用來存放應用程序用到的資源文件,只不過assets目錄中存放的資源不會在R.java文件中進行索引定義。
1.6.4 AndroidManifest.xml文件
在文件AndroidManifest.xml中包含了該項目中所使用的Activity、Service、Receiver,看下面“HelloWorld”項目中的AndroidManfest.xml文件,其代碼為:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.e1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
從上述代碼中,intent-filters描述了Activity啟動的位置和時間。每當一個Activity(或者操作系統)要執行一個操作時,它將創建出一個Intent的對象,這個Intent對象能承載的信息可描述用戶想做什么,用戶想處理什么數據,數據的類型,以及一些其他信息。而Android則會和每個Application所暴露的intent-filter的數據進行比較,找到最合適Activity來處理調用者所指定的數據和操作。下面仔細分析AndroidManifest.xml文件,如表1-3所示。
表1-3 AndroidManifest.xml分析
