官术网_书友最值得收藏!

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分析

主站蜘蛛池模板: 顺平县| 南乐县| 乌拉特后旗| 扎鲁特旗| 枣阳市| 开江县| 正定县| 曲周县| 兴城市| 安新县| 武宣县| 清流县| 牡丹江市| 额济纳旗| 阿坝| 建水县| 荆州市| 原平市| 子长县| 龙川县| 鲁山县| 平遥县| 九龙城区| 利川市| 阳朔县| 泾川县| 蒙自县| 朝阳市| 自贡市| 沙河市| 正镶白旗| 南召县| 周至县| 汽车| 中山市| 新竹市| 高清| 武清区| 慈溪市| 双牌县| 东宁县|