<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Android開(kāi)發(fā)之“hello World”的實(shí)現

Android開(kāi)發(fā)之“hello World”的實(shí)現

作者: 時(shí)間:2011-08-23 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/257842.htm

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

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

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

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

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

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

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

“gen”為資源數據目錄。包含了“aapt”工具在工程內所發(fā)現的所有資源數據。

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

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

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

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

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

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

圖2 Android工程布局

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

下面為主要文件的實(shí)現細節:

1.srccommiaozlhelloWorldhelloWorld.java

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

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

圖3 View子系統類(lèi)圖

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

2.reslayoutmain.xml

代碼2為“helloWorld”工程的main.xml文件,在該文件中定義了該Activity的布局屬性,定義了該Activity的根布局為L(cháng)inearLayout,設置該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 //與父對象一樣寬
android:layout_height=wrap_content //依據內容設置寬度
android:text=@string/hello //設置顯示字符串
/>
/LinearLayout>

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

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

需要說(shuō)明的是,對于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”。

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

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

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

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

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

在實(shí)際實(shí)現中,屏幕密度稱(chēng)為scale,px和dip的轉換過(guò)程如下:

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í)際開(kāi)發(fā)中,很多初學(xué)者容易胡亂的使用這些單位。這會(huì )引起許多潛在的問(wèn)題。

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

其中內填充的屬性設置方式為:

TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello
android:paddingTop=5dip/> //控件頂部?jì)忍畛?dip

外填充的屬性設置方式為:

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

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

3.resvaluesstrings.xml

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

在更復雜的情況下,可能會(huì )遇到字符串數組的情況,其定義方式如下:

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

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

4.. AndroidManifest.xml

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

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過(guò)濾器
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”元素中,開(kāi)發(fā)者可以根據應用的情況指定3種Android的版本信息。android:minSdkVersion屬性描述了該應用正常運行要求的最低Android版本信息,默認值為“1”;android:maxSdkVersion屬性描述了該應用正常運行要求的最高Android版本信息,如果該屬性沒(méi)有聲明,則系統假定其默認值為無(wú)限大;android:targetSdkVersion屬性描述了該應用正常運行的最佳Android版本信息,聲明android:targetSdkVersion屬性,可使應用調用特定平臺的行為,而不是局限于最低版本的平臺支持能力。

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

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

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



關(guān)鍵詞: helloWorld Eclipse Android

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>