來源:Android的应用程序结构分析:HelloActivity

本例以一個簡單的HelloActivity程序為例,簡單介紹Android應用程序的源代碼結構。事實上,Android應用程序雖然不是很復雜,但是通常涉及了JAVA程序,XML文件,Makefile多方面的內容。HelloActivity雖然簡單,但是麻雀雖小,五髒俱全,是學習 Android應用程序的最好示例。
第一部分:HelloActivity的源代碼
HelloActivity工程的源代碼在Android目錄的development/samples/HelloActivity/中,代碼的結構如下所示:
development/samples/HelloActivity/
|-- Android.mk
|-- AndroidManifest.xml
|-- res
|   |-- layout
|   |   |-- hello_activity.xml
|   |-- values
|       |-- strings.xml
|-- src
|   |-- com
|       |-- example
|           |-- android
|               |-- helloactivity
|                   |-- HelloActivity.java
|-- tests
    |-- Android.mk
    |-- AndroidManifest.xml
    |-- src
        |-- com
            |-- android
                |-- helloactivity
                    |-- HelloActivityTest.java
其中tests是一個獨立的項目,可以暫時不考慮。其他部分看作一個Android的一應用程序的工程。這個工程主要的組成部分如下所示:
AndroidManifest.xml:工程的描述文件,在運行時有用處
Android.mk:整個工程的Makefile
res:放置資源文件的目錄
src/com /example/android/helloactivity/HelloActivity.java:這是JAVA類文件,這個文件的路徑表示在 Andorid的JAVA包的結構中的位置,這個包的使用方式為com.example.android.helloactivity。
第二部分: 編譯的中間結果
這個HelloActivity工程經過編譯後將生成out/target/common/obj/APPS /HelloActivity_intermediates/目錄,這個目錄中的內容都是HelloActivity工程相關的,更具體地說都與 development/samples/HelloActivity/中的Android.mk文件相關。
out/target/common/obj/APPS/HelloActivity_intermediates/
|-- classes.dex                       (字節碼)
|-- classes.jar                       (JAR文件)
|-- public_resources.xml              (根據resources結構生成的xml)
|-- src
    |-- R.stamp
    |-- com
        |-- example
            |-- android
                |-- helloactivity
                    |-- R.java        (resources生成的文件)
classes.dex  是一個最重要的文件,它是給Android的JAVA虛擬機Dalvik運行的字節碼文件。
classes.jar是一個JAR文件,JAR的含義為Java ARchive,也就是Java 歸檔,是一種與平台無關的文件格式,可將多個文件合成一個文件。解壓縮之後的目錄結構:(JAVA標准編譯得到的類)
classes
|-- META-INF
|   |-- MANIFEST.MF
|-- com
    |-- example
        |-- android
            |-- helloactivity
                |-- HelloActivity.class
                |-- R$attr.class
                |-- R$id.class
                |-- R$layout.class
                |-- R$string.class
                |-- R.class
各個以class為擴展名的文件,事實上是JAVA程序經過編譯後的各個類的字節碼。
第三部分: 目標apk文件
目標apk文件是Android的JAVA虛擬機Dalvik安裝和運行的文件,事實上這個apk文件將由編譯的中間結果和原始文件生成。apk文件的本質是一個zip包。這個APK包解壓縮後的目錄結構如下所示:
out/target/product/generic/obj/APPS/HelloActivity_intermediates/package.apk_FILES/
|-- AndroidManifest.xml
|-- META-INF
|   |-- CERT.RSA
|   |-- CERT.SF
|   |-- MANIFEST.MF
|-- classes.dex
|-- res
|   |-- layout
|       |-- hello_activity.xml
|-- resources.arsc
值得注意的是,這裡的xml文件經過了處理,和原始的文件不太一樣,不能按照文本文件的方式閱讀。
第四部分: 源代碼的各個文件
Android.mk是整個工程的“Makefile”,其內容如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := samples
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := HelloActivity
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
這個文件在各個Android的工程中都是類似的,其中LOCAL_PACKAGE_NAME表示了這個包的名字。LOCAL_MODULE_TAGS 表示了模塊的標,在這裡使用的是
samples,正式的應用程序(packages目錄中的應用)中多使用eng development。
AndroidManifest.xml是這個HelloActivity工程的描述文件,其內容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.helloactivity">
    <application android:label="Hello, Activity!">
        <activity android:name="HelloActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
其中package用於說明這個包的名稱,android:labeapplication中的內容是表示這個應用程序在界面上顯示的標題,activity中的android:name表示這個Android的活動的名稱。
文件src/com/example/android/helloactivity/HelloActivity.java是程序主要文件,由JAVA語言寫成
package com.example.android.helloactivity;
import android.app.Activity;             
import android.os.Bundle;                
public class HelloActivity extends Activity {
    public HelloActivity() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_activity);
    }
}
com.example.android.helloactivity表示的是這個包的名稱,在文件的頭部引入了兩個包android.app.Activity是一個Android活動(Activity)包,每一個Android活動都需要繼承Activity類。
包android.os.Bundle用於映射字符串的值。
onCreate()是一個重載的函數,在這個函數中實現應用程序創建的所執行的過程。其中setContentView()設置當前的視圖(View)。
設置的方法是使用一個文件,這個文件因此決定了視圖中包含的內容。這裡使用的是R.layout.hello_activity,表示從res/layout/目錄中使用hello_activity.xml文件。
res/layout/hello_activity.xml文件的內容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textSize="18sp"
    android:autoText="true"
    android:capitalize="sentences"
    android:text="@string/hello_activity_text_text" />
其中定義了一個可編輯的文本(EditText),下面的各項其實是它的各種屬性,android:text表示這個文本的內容,string/hello_activity_text_text表示找到相應的文件,也就是res/value/string.xml文件中的 hello_activity_text_text文本。
res/value/string.xml的內容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello_activity_text_text">Hello, World!</string>
</resources>
hello_activity_text_text文本被res/layout/hello_activity.xml文件引用,正是應用程序運行時在屏幕顯示的文本。

kezeodsnx 發表在 痞客邦 PIXNET 留言(0) 人氣()