當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]按照慣例,同時(shí)也是為了更好地引導(dǎo)讀者進(jìn)入精彩的Android世界,我們接下來要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的“hello World”例子。

按照慣例,同時(shí)也是為了更好地引導(dǎo)讀者進(jìn)入精彩的Android世界,我們接下來要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的“hello World”例子。這里以Android SDK 2.1為基礎(chǔ)基于Eclipse Galileo(Eclipse 3.5)作為IDE來完成開發(fā)。

通過“File”→“New”→“Project”創(chuàng)建Android工程,如圖1所示。設(shè)置“Project name:”為“helloWorld”,設(shè)置“Build Target”為“Android 2.1”,設(shè)置“Application name:”為“helloWorld”,設(shè)置“Package name:”為“com.miaozl.helloWorld”,設(shè)置“Create Activity:”為“helloWorld”。然后單擊“Finish”按鈕即可完成工程的創(chuàng)建。

圖1 創(chuàng)建Android工程

需要說明的是,在Android的設(shè)計(jì)中,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版本的選擇上,應(yīng)在考慮技術(shù)實(shí)現(xiàn)可行性的前提下,選擇盡量小的版本,這有利于擴(kuò)大兼容的物理設(shè)備。

在創(chuàng)建Android工程的過程中。由于Eclipse的原因,系統(tǒng)可能會(huì)提示“no classfiles specified,Conversion to Dalvik format failed with error 1”,如果出現(xiàn)該錯(cuò)誤信息,按“F5”鍵刷新一次工程即可。需要說明的是,在Foryo后,該問題已經(jīng)很少出現(xiàn)。對(duì)于復(fù)制過來的工程,可能會(huì)引起工程屬性方面的問題,這一問題可以通過Android工程的右鍵菜單選擇“Android Tools”→“Fix Project Properties”修復(fù)系統(tǒng)屬性解決。

另外如果是第一次創(chuàng)建工程, Eclipse會(huì)提示用戶“Failed to find an AVD compatible with target”。這是由于Android在稍后的版本中不再提供默認(rèn)的Android虛擬設(shè)備(AVD,Android Virtual Device),需要用戶自行創(chuàng)建。在Linux中,AVD相關(guān)的文件包括userdata.img映像文件,默認(rèn)情況下存于/root/.android目錄中,AVD描述了當(dāng)前模擬器的設(shè)備配置信息。當(dāng)工程創(chuàng)建完成后,即可在Eclipse的“Package Explorer”中看到Android的工程布局。Eclipse對(duì)于所轄工程的維護(hù)默認(rèn)情況下位于/root/workspace/.metedata目錄中。如果期望獲得一個(gè)干凈的運(yùn)行環(huán)境,直接刪除/root/.android和/root/workspace/.metedata目錄即可。

如圖2所示為所生成的Android的“helloWorld”工程布局,其中“.settings”描述了Eclipse和采用的JDT包的若干信息;“.assets”為空目錄,描述了工程的斷言信息,斷言并不常用,常見的用法是維護(hù)一些工程的資源文件,但斷言對(duì)于單個(gè)文件有1MB的大小限制。

“bin”為輸出文件目錄,包含了各源文件對(duì)應(yīng)的CLASS字節(jié)碼文件、“ap_”格式的資源文件、DEX字節(jié)碼文件和最終利用“aapt”工具打包的APK格式的Android安裝包。需要說明的是APK格式的Android安裝包本質(zhì)上為ZIP格式的壓縮包,包含了資源、DEX字節(jié)碼文件和AndroidManifest.xml等,當(dāng)系統(tǒng)檢測(cè)到APK格式的文件時(shí),系統(tǒng)會(huì)把它當(dāng)做一個(gè)應(yīng)用看待。

“gen”為資源數(shù)據(jù)目錄。包含了“aapt”工具在工程內(nèi)所發(fā)現(xiàn)的所有資源數(shù)據(jù)。

“res”為描述資源的XML文件目錄,通常包括“drawable”、“layout”、“values”等子目錄,描述了工程涉及的圖標(biāo)、字符串和布局等信息,復(fù)雜的應(yīng)用還涉及“menu”、“color”、“style”等目錄。其中布局資源文件為main.xml,字符串資源文件為strings.xml。

“src”為工程源文件目錄,包含了開發(fā)者創(chuàng)建的Java文件。

“.classpath”文件描述了工程涉及的路徑信息。

“.project”文件描述了工程名、所需的編譯命令等工程信息。

“AndroidManifest.xml”則描述了工程實(shí)現(xiàn)細(xì)節(jié)如“manifest”、“application”、“activity”、“intent-filter”、“action”、“category”、SDK版本信息等信息、應(yīng)用程序的權(quán)限等,是Android工程中最重要的文件。

“default.properties”描述了SDK的版本信息。

圖2 Android工程布局

對(duì)于基于原生代碼的應(yīng)用,在工程下可能還存在“jni”目錄用于存放原生源代碼,存在“libs”目錄,用于存放編譯原生源代碼生成的動(dòng)態(tài)共享庫(kù)等。

下面為主要文件的實(shí)現(xiàn)細(xì)節(jié):

1.srccommiaozlhelloWorldhelloWorld.java

代碼1為“hello World”工程的helloWorld.java文件的內(nèi)容,在該文件中定義了一個(gè)名為“helloWorld”的Activity,并通過setContentView()函數(shù)加載該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); //創(chuàng)建Activity
setContentView(R.layout.main); //加載布局資源
}
}

利用setContentView ()函數(shù)還可以直接加載View類,View是用來構(gòu)建應(yīng)用程序的UI控件系統(tǒng)的,包括列表(Lists)、網(wǎng)格(Grids)、文本框(Text Boxs)、按鈕(Buttons)等擴(kuò)展類。圖3顯示了Android系統(tǒng)的View子系統(tǒng)的類圖。其中android.view.View類為UI控件的基類,android.view.ViewGroup為布局類的基類。

圖3 View子系統(tǒng)類圖

Activity與窗口管理器有著密切的關(guān)系。View子系統(tǒng)是Android整個(gè)UI框架的基礎(chǔ)。

2.reslayoutmain.xml

代碼2為“helloWorld”工程的main.xml文件,在該文件中定義了該Activity的布局屬性,定義了該Activity的根布局為L(zhǎng)inearLayout,設(shè)置該Activity為豎向的全屏窗口,并定義了一個(gè)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" //與父對(duì)象一樣寬
android:layout_height="wrap_content" //依據(jù)內(nèi)容設(shè)置寬度
android:text="@string/hello" //設(shè)置顯示字符串
/>
</LinearLayout>

在Android中,布局管理器決定了Activity中的UI接口的布局, UI的布局具有兩種方式,一種是基于XML文件實(shí)現(xiàn),另一種是基于代碼實(shí)現(xiàn)。其中基于XML文件的方式主要用于針對(duì)不同屏幕旋轉(zhuǎn)度、不同顯示分辨率和不同本地化語(yǔ)言的默認(rèn)方式的布局,有利于解耦應(yīng)用的行為和顯示,可以幫助用戶在不修改代碼的情況下改變應(yīng)用的布局;基于代碼的方式則側(cè)重于實(shí)時(shí)修改布局,性能上略占優(yōu)勢(shì),但不利于應(yīng)用的本地化和適應(yīng)不同的硬件設(shè)備。尤其是隨著平板電腦的目標(biāo)環(huán)境引入,硬件環(huán)境更趨復(fù)雜。

在XML布局文件中,必須存在一個(gè)類型為View和ViewGroup的根元素(main.xml文件中的根元素為L(zhǎng)inearLayout)。只有在定義了根元素之后,用戶才能添加隨后的布局對(duì)象或者UI控件(如main.xml文件中的TextView等)。

需要說明的是,對(duì)于UI控件而言,其“android:layout_width”和“android:layout_height”屬性在較高版本中通常有三個(gè)屬性值即"fill_parent"、"match_parent"、"wrap_content"可以選擇。其中"fill_parent"和"match_parent"屬性值的定義均為“-1”。其實(shí)際意義相同。"match_parent"屬性值具有更明確的字面含義,受到Google的推薦。

如果在不同的屏幕方向或者硬件配置、語(yǔ)言環(huán)境下,布局文件稍有不同,可以將同名布局文件放置在不同的布局文件夾下,如在簡(jiǎn)體中文環(huán)境下的布局文件夾為“layout-zh-rCN”。

在構(gòu)建布局文件時(shí),很自然會(huì)涉及到像素的問題,在Android中,有dp、px、dip等幾種單位,其中dip獨(dú)立于物理設(shè)備,是Android為了適應(yīng)多種不同分辨率而設(shè)計(jì)的像素單位,最常用的也是dip。

需要注意的是dip的設(shè)置與分辨率無關(guān),但與屏幕密度(density)有關(guān),默認(rèn)情況下,QVGA的密度為120,系數(shù)為0.75,HVGA的密度為160,系數(shù)為1.0,WVGA的密度為240,系數(shù)為1.5。需要說明的是,目前Android支持的密度包括xhdpi、hdpi、mdpi、ldpi。其中hdpi通常適用于高分辨率的智能終端,mdpi則通常用于高分辨率的平板電腦。而ldpi則適用于入門級(jí)的智能終端。另外,在Foryo中,還引入了xhdpi的概念,其密度定義為320,適用于擁有高分屏的高端智能終端,針對(duì)不同密度,Android對(duì)其采用的菜單圖標(biāo)、應(yīng)用圖標(biāo)等的大小做了明確的定義。針對(duì)hdpi的密度,其菜單圖標(biāo)和應(yīng)用圖標(biāo)的大小為72*72,針對(duì)mdpi的密度,其菜單圖標(biāo)和應(yīng)用圖標(biāo)的大小為48*48,針對(duì)ldpi的密度,其菜單圖標(biāo)和應(yīng)用圖標(biāo)的大小為36*36。

另外還有一個(gè)nodpi的概念需要注意,這個(gè)概念是為避免像素伸縮的圖片資源而設(shè)計(jì)的。

px與dip的關(guān)系如下:

px = (int) (dip*density+0.5f) //一個(gè)dip在hdpi下,相當(dāng)于1.5個(gè)物理像素

在實(shí)際實(shí)現(xiàn)中,屏幕密度稱為scale,px和dip的轉(zhuǎn)換過程如下:

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);
}
}

同時(shí),在描述字體的大小時(shí),涉及的單位為sp。在實(shí)際開發(fā)中,很多初學(xué)者容易胡亂的使用這些單位。這會(huì)引起許多潛在的問題。

在設(shè)置控件的填充時(shí),需要注意到Android提供了兩種填充類型:內(nèi)填充和外填充,對(duì)于內(nèi)填充即填充占用的空間屬于該控件的一部分,對(duì)于外填充即填充占用的空間屬于該控件的父控件的一部分。

其中內(nèi)填充的屬性設(shè)置方式為:

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:paddingTop="5dip"/> //控件頂部?jī)?nèi)填充5dip

外填充的屬性設(shè)置方式為:

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:layout_marginTop="5dip"/> //控件頂部外填充5dip

布局文件在實(shí)際的開發(fā)者有很多的技巧需要揣摩,如何使做的設(shè)計(jì)更加靈活,能夠適應(yīng)多種設(shè)備,不是一言能蔽之的。希望讀者多加體會(huì)。

3.resvaluesstrings.xml

代碼3為“helloWorld”工程的strings.xml文件,在該文件中,定義了Activity所涉及的字符串資源。為了進(jìn)行軟件的本地化,Android采用了ISO命名規(guī)范來設(shè)置不同語(yǔ)言的資源目錄名,對(duì)于簡(jiǎn)體中文,資源目錄為“values-zh-rCN”;對(duì)于繁體中文,資源目錄為“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>

在更復(fù)雜的情況下,可能會(huì)遇到字符串?dāng)?shù)組的情況,其定義方式如下:

<string-array name="imAddressTypes">
<item>Home</item>
<item>Work</item>
<item>Other</item>
<item>Custom</item>
</string-array>

其他類型的數(shù)組還包括顏色數(shù)組、圖片數(shù)組、整數(shù)數(shù)組等,其定義方式可以參考frameworks/base/core/res/res/values/arrays.xml文件。

4.. AndroidManifest.xml

代碼4為“helloWorld”工程的AndroidManifest.xml文件。對(duì)于每個(gè)應(yīng)用而言,該文件唯一

AndroidManifest.xml文件定義了應(yīng)用的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" //版本號(hào),必須為整數(shù),用于判斷是否升級(jí)等
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”元素中,開發(fā)者可以根據(jù)應(yīng)用的情況指定3種Android的版本信息。android:minSdkVersion屬性描述了該應(yīng)用正常運(yùn)行要求的最低Android版本信息,默認(rèn)值為“1”;android:maxSdkVersion屬性描述了該應(yīng)用正常運(yùn)行要求的最高Android版本信息,如果該屬性沒有聲明,則系統(tǒng)假定其默認(rèn)值為無限大;android:targetSdkVersion屬性描述了該應(yīng)用正常運(yùn)行的最佳Android版本信息,聲明android:targetSdkVersion屬性,可使應(yīng)用調(diào)用特定平臺(tái)的行為,而不是局限于最低版本的平臺(tái)支持能力。

除了Activity外,在實(shí)際開發(fā)中,構(gòu)建的服務(wù)(service)、接收器(receiver)、提供器(provider)、用到的庫(kù)(uses-library)等都必須在AndroidManifest.xml中聲明,否則會(huì)引發(fā)異常。其中服務(wù)和提供器可以被其他應(yīng)用調(diào)用。

“android:versionCode”屬性定義了該應(yīng)用的當(dāng)前版本號(hào),配合數(shù)字簽名證書可以用于應(yīng)用的升級(jí)。“android:versionName”屬性通常指定顯示給最終用戶的版本信息。

在Foryo中,Android增加了“android:installLocation”屬性,可以使開發(fā)者指定應(yīng)用安裝的位置,其值包括:"auto"、"internalOnly"、"preferExternal"。這有利于入門級(jí)Android終端的市場(chǎng)拓展。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉