Android開發之“hello World”的實現 – Android移動開發技術文章_手機開發 Android移動開發教學課程

按照慣例,同時也是為瞭更好地引導讀者進入精彩的Android世界,我們接下來要實現一個簡單的“hello World”例子。這裡以Android SDK 2.1為基礎基於Eclipse Galileo(Eclipse 3.5)作為IDE來完成開發。
通過“File”→“New”→“Project”創建Android工程,如圖1所示。設置“Project name:”為“helloWorld”,設置“Build Target”為“Android 2.1”,設置“Application name:”為“helloWorld”,設置“Package name:”為“com.miaozl.helloWorld”,設置“Create Activity:”為“helloWorld”。然後單擊“Finish”按鈕即可完成工程的創建。

圖1 創建Android工程
需要說明的是,在Android的設計中,Android 1.0的SDK版本為“1”、Android 1.1的SDK版本為“2”、Android 1.5的SDK版本為“3”、 Android 1.5的SDK版本為“3”、 Android 1.6的SDK版本為“4”、 Android 2.0的SDK版本為“5”、 Android 2.0.1的SDK版本為“6”、 Android 2.1的SDK版本為“7”,Android 2.2的SDK版本為“8”,Android 2.3的SDK版本為“9”,Android 3.0的SDK版本為“Honeycomb”。在具體SDK版本的選擇上,應在考慮技術實現可行性的前提下,選擇盡量小的版本,這有利於擴大兼容的物理設備。
在創建Android工程的過程中。由於Eclipse的原因,系統可能會提示“no classfiles specified,Conversion to Dalvik format failed with error 1”,如果出現該錯誤信息,按“F5”鍵刷新一次工程即可。需要說明的是,在Foryo後,該問題已經很少出現。對於復制過來的工程,可能會引起工程屬性方面的問題,這一問題可以通過Android工程的右鍵菜單選擇“Android Tools”→“Fix Project Properties”修復系統屬性解決。
另外如果是第一次創建工程, Eclipse會提示用戶“Failed to find an AVD compatible with target”。這是由於Android在稍後的版本中不再提供默認的Android虛擬設備(AVD,Android Virtual Device),需要用戶自行創建。在Linux中,AVD相關的文件包括userdata.img映像文件,默認情況下存於/root/.android目錄中,AVD描述瞭當前模擬器的設備配置信息。當工程創建完成後,即可在Eclipse的“Package Explorer”中看到Android的工程佈局。Eclipse對於所轄工程的維護默認情況下位於/root/workspace/.metedata目錄中。如果期望獲得一個幹凈的運行環境,直接刪除/root/.android和/root/workspace/.metedata目錄即可。
如圖2所示為所生成的Android的“helloWorld”工程佈局,其中“.settings”描述瞭Eclipse和采用的JDT包的若幹信息;“.assets”為空目錄,描述瞭工程的斷言信息,斷言並不常用,常見的用法是維護一些工程的資源文件,但斷言對於單個文件有1MB的大小限制。
“bin”為輸出文件目錄,包含瞭各源文件對應的CLASS字節碼文件、“ap_”格式的資源文件、DEX字節碼文件和最終利用“aapt”工具打包的APK格式的Android安裝包。需要說明的是APK格式的Android安裝包本質上為ZIP格式的壓縮包,包含瞭資源、DEX字節碼文件和AndroidManifest.xml等,當系統檢測到APK格式的文件時,系統會把它當做一個應用看待。
“gen”為資源數據目錄。包含瞭“aapt”工具在工程內所發現的所有資源數據。
“res”為描述資源的XML文件目錄,通常包括“drawable”、“layout”、“values”等子目錄,描述瞭工程涉及的圖標、字符串和佈局等信息,復雜的應用還涉及“menu”、“color”、“style”等目錄。其中佈局資源文件為main.xml,字符串資源文件為strings.xml。
“src”為工程源文件目錄,包含瞭開發者創建的Java文件。
“.classpath”文件描述瞭工程涉及的路徑信息。
“.project”文件描述瞭工程名、所需的編譯命令等工程信息。
“AndroidManifest.xml”則描述瞭工程實現細節如“manifest”、“application”、“activity”、“intent-filter”、“action”、“category”、SDK版本信息等信息、應用程序的權限等,是Android工程中最重要的文件。
“default.properties”描述瞭SDK的版本信息。

圖2 Android工程佈局
對於基於原生代碼的應用,在工程下可能還存在“jni”目錄用於存放原生源代碼,存在“libs”目錄,用於存放編譯原生源代碼生成的動態共享庫等。
下面為主要文件的實現細節:
1.src\com\miaozl\helloWorld\helloWorld.java
代碼1為“hello World”工程的helloWorld.java文件的內容,在該文件中定義瞭一個名為“helloWorld”的Activity,並通過setContentView()函數加載該Activity的佈局資源文件。
代碼1 helloWorld.java
package com.miaozl.helloWorld;
        import android.app.Activity;
        import android.os.Bundle;
        public class helloWorld extends Activity {
                /** Called when the activity is first created. */
                @Override
                public void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState); //創建Activity
                        setContentView(R.layout.main); //加載佈局資源
                }
        }
利用setContentView ()函數還可以直接加載View類,View是用來構建應用程序的UI控件系統的,包括列表(Lists)、網格(Grids)、文本框(Text Boxs)、按鈕(Buttons)等擴展類。圖3顯示瞭Android系統的View子系統的類圖。其中android.view.View類為UI控件的基類,android.view.ViewGroup為佈局類的基類。

圖3 View子系統類圖
Activity與窗口管理器有著密切的關系。View子系統是Android整個UI框架的基礎。
2.res\layout\main.xml
代碼2為“helloWorld”工程的main.xml文件,在該文件中定義瞭該Activity的佈局屬性,定義瞭該Activity的根佈局為LinearLayout,設置該Activity為豎向的全屏窗口,並定義瞭一個TextView 控件。
代碼2 main.xml
<?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android //定義根佈局,定義xmlns的名字空間
                android:orientation="vertical" // Activity為豎向
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                >
        <TextView
                android:layout_width="fill_parent" //與父對象一樣寬
                android:layout_height="wrap_content" //依據內容設置寬度
                android:text="@string/hello" //設置顯示字符串
                />
        </LinearLayout>
在Android中,佈局管理器決定瞭Activity中的UI接口的佈局, UI的佈局具有兩種方式,一種是基於XML文件實現,另一種是基於代碼實現。其中基於XML文件的方式主要用於針對不同屏幕旋轉度、不同顯示分辨率和不同本地化語言的默認方式的佈局,有利於解耦應用的行為和顯示,可以幫助用戶在不修改代碼的情況下改變應用的佈局;基於代碼的方式則側重於實時修改佈局,性能上略占優勢,但不利於應用的本地化和適應不同的硬件設備。尤其是隨著平板電腦的目標環境引入,硬件環境更趨復雜。
在XML佈局文件中,必須存在一個類型為View和ViewGroup的根元素(main.xml文件中的根元素為LinearLayout)。隻有在定義瞭根元素之後,用戶才能添加隨後的佈局對象或者UI控件(如main.xml文件中的TextView等)。
需要說明的是,對於UI控件而言,其“android:layout_width”和“android:layout_height”屬性在較高版本中通常有三個屬性值即"fill_parent"、"match_parent"、"wrap_content"可以選擇。其中"fill_parent"和"match_parent"屬性值的定義均為“-1”。其實際意義相同。"match_parent"屬性值具有更明確的字面含義,受到Google的推薦。
如果在不同的屏幕方向或者硬件配置、語言環境下,佈局文件稍有不同,可以將同名佈局文件放置在不同的佈局文件夾下,如在簡體中文環境下的佈局文件夾為“layout-zh-rCN”。
在構建佈局文件時,很自然會涉及到像素的問題,在Android中,有dp、px、dip等幾種單位,其中dip獨立於物理設備,是Android為瞭適應多種不同分辨率而設計的像素單位,最常用的也是dip。
需要註意的是dip的設置與分辨率無關,但與屏幕密度(density)有關,默認情況下,QVGA的密度為120,系數為0.75,HVGA的密度為160,系數為1.0,WVGA的密度為240,系數為1.5。需要說明的是,目前Android支持的密度包括xhdpi、hdpi、mdpi、ldpi。其中hdpi通常適用於高分辨率的智能終端,mdpi則通常用於高分辨率的平板電腦。而ldpi則適用於入門級的智能終端。另外,在Foryo中,還引入瞭xhdpi的概念,其密度定義為320,適用於擁有高分屏的高端智能終端,針對不同密度,Android對其采用的菜單圖標、應用圖標等的大小做瞭明確的定義。針對hdpi的密度,其菜單圖標和應用圖標的大小為72*72,針對mdpi的密度,其菜單圖標和應用圖標的大小為48*48,針對ldpi的密度,其菜單圖標和應用圖標的大小為36*36。
另外還有一個nodpi的概念需要註意,這個概念是為避免像素伸縮的圖片資源而設計的。
px與dip的關系如下:
px = (int) (dip*density+0.5f) //一個dip在hdpi下,相當於1.5個物理像素
在實際實現中,屏幕密度稱為scale,px和dip的轉換過程如下:
public void scale(float scale) {
                x = (int) (x * scale + 0.5f);
                y = (int) (y * scale + 0.5f);
                if (width > 0) {
                        width = (int) (width * scale + 0.5f);
                }
                if (height > 0) {
                        height = (int) (height * scale + 0.5f);
                }
        }
同時,在描述字體的大小時,涉及的單位為sp。在實際開發中,很多初學者容易胡亂的使用這些單位。這會引起許多潛在的問題。
在設置控件的填充時,需要註意到Android提供瞭兩種填充類型:內填充和外填充,對於內填充即填充占用的空間屬於該控件的一部分,對於外填充即填充占用的空間屬於該控件的父控件的一部分。
其中內填充的屬性設置方式為:
<TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/hello"
        android:paddingTop="5dip"/> //控件頂部內填充5dip
外填充的屬性設置方式為:
<TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="@string/hello"
                android:layout_marginTop="5dip"/> //控件頂部外填充5dip
佈局文件在實際的開發者有很多的技巧需要揣摩,如何使做的設計更加靈活,能夠適應多種設備,不是一言能蔽之的。希望讀者多加體會。
3.res\values\strings.xml
代碼3為“helloWorld”工程的strings.xml文件,在該文件中,定義瞭Activity所涉及的字符串資源。為瞭進行軟件的本地化,Android采用瞭ISO命名規范來設置不同語言的資源目錄名,對於簡體中文,資源目錄為“values-zh-rCN”;對於繁體中文,資源目錄為“values-zh-rTW”。
代碼3 strings.xml
<?xml version="1.0" encoding="utf-8"?>
        <resources>
                <string name="hello">Hello World, helloWorld!</string> //“hello”字符串
                <string name="app_name">helloWorld</string> //“app_name”字符串
        </resources>
在更復雜的情況下,可能會遇到字符串數組的情況,其定義方式如下:
<string-array name="imAddressTypes">
                <item>Home</item>
                <item>Work</item>
                <item>Other</item>
                <item>Custom</item>
        </string-array>
其他類型的數組還包括顏色數組、圖片數組、整數數組等,其定義方式可以參考frameworks/base/core/res/res/values/arrays.xml文件。
4..\ AndroidManifest.xml
代碼4為“helloWorld”工程的AndroidManifest.xml文件。對於每個應用而言,該文件唯一
AndroidManifest.xml文件定義瞭應用的activity、intent、uses-sdk、uses-permission、service、uses-library、Content provider、Broadcast Receiver等信息。
代碼4 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                package="com.miaozl.helloWorld" //包名
                android:versionCode="1" //版本號,必須為整數,用於判斷是否升級等
                android:versionName="1.0"> //版本名
                <application android:icon="@drawable/icon" android:label="@string/app_name">
                <activity android:name=".helloWorld" //定義activity
                        android:label="@string/app_name">
                <intent-filter> //定義intent過濾器
                        <action android:name="android.intent.action.MAIN" />
                        <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
              </activity>
            </application>
          <uses-sdk android:minSdkVersion="7" /> //定義采用的Android版本信息
        </manifest>
在“uses-sdk”元素中,開發者可以根據應用的情況指定3種Android的版本信息。android:minSdkVersion屬性描述瞭該應用正常運行要求的最低Android版本信息,默認值為“1”;android:maxSdkVersion屬性描述瞭該應用正常運行要求的最高Android版本信息,如果該屬性沒有聲明,則系統假定其默認值為無限大;android:targetSdkVersion屬性描述瞭該應用正常運行的最佳Android版本信息,聲明android:targetSdkVersion屬性,可使應用調用特定平臺的行為,而不是局限於最低版本的平臺支持能力。
除瞭Activity外,在實際開發中,構建的服務(service)、接收器(receiver)、提供器(provider)、用到的庫(uses-library)等都必須在AndroidManifest.xml中聲明,否則會引發異常。其中服務和提供器可以被其他應用調用。
“android:versionCode”屬性定義瞭該應用的當前版本號,配合數字簽名證書可以用於應用的升級。“android:versionName”屬性通常指定顯示給最終用戶的版本信息。
在Foryo中,Android增加瞭“android:installLocation”屬性,可以使開發者指定應用安裝的位置,其值包括:"auto"、"internalOnly"、"preferExternal"。這有利於入門級Android終端的市場拓展。

 

本文出自 “嵌入式” 博客

發佈留言