第三章 第一個(gè)Android程序

參考資料:
《Android應(yīng)用程序開發(fā)》ISBN 9787302283164
參考軟件:
Android Studio、Eclipse+ADT、Android SDK、JDK
常見的手機(jī)硬件參數(shù)知識
1、分辨率
手機(jī)屏幕尺寸分為物理尺寸和顯示分辨率兩個(gè)概念。
物理尺寸是指屏幕的實(shí)際大小,以屏幕的對角線長度作為依據(jù)(比如3.5英寸、4.0英寸)。
屏幕分辨率反映的是在物理尺寸下可以顯示的像素?cái)?shù)量。分辨率是以乘法形式表現(xiàn),比如手機(jī)常見的320×480,其中“320”表示屏幕上水平方向顯示的點(diǎn)數(shù),“480”表示垂直方向的點(diǎn)數(shù)。分辨率越大表示像素的數(shù)量越多,圖像就越清晰,因此這個(gè)指標(biāo)是決定畫面好壞的最主要因素。
兩臺手機(jī)的物理尺寸一樣并不表示其分辨率相同,不同物理尺寸的手機(jī),可以都顯示相同的分辨率,例如:4.3英寸三星i9100和4.0英寸的HTC G11都是具有480×800像素(WVGA)。
大家都能發(fā)現(xiàn),現(xiàn)在流行的分辨率大都跟VGA沾點(diǎn)關(guān)系,無論是QVGA、WVGA還是HVGA等等,因?yàn)閂GA就是這些尺寸的基礎(chǔ)。VGA最早其實(shí)是IBM計(jì)算機(jī)的一種顯示標(biāo)準(zhǔn),最后逐漸的演變,成了640×480這個(gè)分辨率的代名詞,也是絕大多數(shù)分辨率的基準(zhǔn)。
QVGA
QVGA就是Quarter VGA的簡稱,意思是VGA分辨率的四分之一,這是目前最為常見的手機(jī)屏幕分辨率,豎向的就是240×320像素,橫向的就是320×240像素。?
HVGA
HVGA代表的意思是Half-size VGA,意思是VGA分辨率的一半,為480×320像素,寬高比為3:2。?
WVGA
WVGA的全稱想必大家很容易就能想到了,那就是?Wide VGA,分辨率分為854×480像素和800×480像素兩種。
SVGA
SVGA是Super VGA,就是我們常見的800×600像素 ,而1024×768像素就不再基于VGA的標(biāo)準(zhǔn),轉(zhuǎn)為XGA成為了新一代顯示設(shè)備分辨率的基準(zhǔn)。隨著顯示設(shè)備行業(yè)的發(fā)展,SXGA+(1400×1050像素)、UXGA(1600×1200像素,常用于20寸或21寸顯示器)、QXGA(2048×1536像素)也逐漸浮出水面, QXGA就已經(jīng)是XGA的四倍 ,也是大多數(shù)顯示設(shè)備支持的極限,當(dāng)然也有更高的QUXGA,但是這只是理論上的名字,現(xiàn)實(shí)世界中還沒有采用這個(gè)分辨率的顯示設(shè)備。17寸的彩色顯示器大都是SVGA、XGA或者SXGA+級別。
4:3屏幕的發(fā)展也帶動(dòng)了寬屏幕的發(fā)展,最早是WVGA(800×480像素),常用語大多數(shù)的MID和小號的上網(wǎng)本,后來為WSVGA(1024×600分辨率),這種分辨率多用于8.9寸或10寸的上網(wǎng)本。
WXGA
在發(fā)展到后來?WXGA(1280×800像素)逐漸在13-15寸的筆記本電腦上流行起來 ;WXGA+(1440×900像素)多用于19寸寬屏;WSXGA+(1680×1050像素)則常用于20寸和22寸的寬屏,也有部分15.4寸的筆記本使用這種分辨率;WUXGA(1920×1200像素)是頗為流行的分辨率之一,24-27寸的寬屏顯示器大多是這種分辨率;而WQXGA(2560×1600像素)這種分辨率主要是用在30寸的LCD屏幕,比如著名的Apple Cinema Display、Dell UltraSharp 3007WFP/3008 WFP都采用的這種分辨率。
2、分辨率比
而所謂的4:3、16:9、16:10、21:9這些比值其實(shí)就是 分辨率中橫向像素與豎向像素的比值 。4:3是我們最初所用的分辨率尺寸比,以前的電腦屏幕幾乎都是4:3;隨后寬屏顯示器出現(xiàn),16:10開始流行,比較常見的分辨率有1280×800像素。
3、色彩數(shù)量
屏幕顏色是由色階來決定。色階是表示手機(jī)液晶顯示屏亮度強(qiáng)弱的指數(shù)標(biāo)準(zhǔn),也就是通常所說的色彩指數(shù),表示了色彩的豐滿程度。
目前手機(jī)的色階指數(shù)從低到高可分為:最低單色,其次是256色、4096色、 65536色、26萬色、1600萬色。
256=2的8次方,即8位彩色;依次類推,65536色=2的16次方,即通常所說的16位真彩色;26萬=2的18次方,也就是18位真彩;1600 萬=2的24次方,也就是24位真彩。
目前手機(jī)能達(dá)到的色彩數(shù)量也是限制美術(shù)人員發(fā)揮的一個(gè)重要瓶頸。將色階高的圖片放到色階低的手機(jī)上,會(huì)產(chǎn)生圖片色彩的失真,有的顏色無法區(qū)分,色偏嚴(yán)重。所以,設(shè)計(jì)人員需要根據(jù)實(shí)際手機(jī)進(jìn)行圖片繪制。
4、CPU
?一臺手機(jī)像電腦一樣具有CPU和內(nèi)存的,特別是智能手機(jī)目前越來越普遍,更高的CPU硬件配置將成為手機(jī)發(fā)展的一個(gè)趨勢,雙核、四核的手機(jī)CPU已出現(xiàn)。
CPU具有運(yùn)算器和控制器功能,是手機(jī)的心臟,構(gòu)成了系統(tǒng)的控制中心,對各部件進(jìn)行統(tǒng)一協(xié)調(diào)和控制。
主頻是衡量手機(jī)CPU性能高低的一個(gè)重要技術(shù)參數(shù),頻率越高,表明指令的執(zhí)行速度越快,指令的執(zhí)行時(shí)間也就越短,對信息的處理能力與效率就高。
德州儀器、Marvell公司、高通(QUALCOMM)公司是業(yè)界較有名的手機(jī)CPU廠商。
5、內(nèi)存
手機(jī)上的內(nèi)存分為RAM和ROM,其中RAM是動(dòng)態(tài)內(nèi)存,相當(dāng)于電腦的內(nèi)存,是影響手機(jī)程序運(yùn)行性能的重要指標(biāo),在RAM中的數(shù)據(jù)在手機(jī)關(guān)閉后丟失。目前來說,512M的RAM可以較好地保證手機(jī)使用的流暢性。
ROM則相當(dāng)于電腦的硬盤,用于存儲手機(jī)操作系統(tǒng)、應(yīng)用程序和用戶的文件,ROM中的信息在掉電后并不會(huì)丟失。隨著手機(jī)上安裝程序的增多,以及數(shù)據(jù)信息的累加,ROM的可用空間會(huì)不斷減少。如果ROM的空間太少,就會(huì)影響到手機(jī)的操作速度。這一點(diǎn)和電腦引導(dǎo)盤空間(例如:Windows系統(tǒng)的C盤)的減少會(huì)影響電腦的使用類似。
手機(jī)的大小可以通過增加SD卡來做進(jìn)一步擴(kuò)充,一般用于存放用戶的文件,例如視頻、音頻文件??梢詫⑵淅斫鉃殡娔X上的外接移動(dòng)硬盤。
6、像素單位
dp(dip): device independent pixels(設(shè)備獨(dú)立像素). 不同設(shè)備有不同的顯示效果,這個(gè)和設(shè)備硬件有關(guān),一般我們為了支持WVGA、HVGA和QVGA 推薦使用dp,不依賴像素。
px: pixels(像素). 不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個(gè)用的比較多。
pt: point,是一個(gè)標(biāo)準(zhǔn)的長度單位,1pt=1/72英寸,用于印刷業(yè),非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字體顯示best for textsize。
由此,根據(jù) google 的建議,TextView 的字號最好使用 sp 做單位,而且查看TextView的源碼可知 Android 默認(rèn)使用 sp 作為字號單位。
還有, google代碼里邊所用的單位都是以px為默認(rèn)單位的.
項(xiàng)目組織結(jié)構(gòu)
查看項(xiàng)目結(jié)構(gòu)方式有如下幾種:

一、Project視圖模式

.idea
關(guān)于IntelliJIDEA配置文件目錄
app
應(yīng)用模塊的目錄和文件。
build
這個(gè)目錄存儲所有項(xiàng)目模塊的編譯輸出。
gradle
包含gradle-wrapper文件
.gitignore
明確Git應(yīng)當(dāng)忽略的文件
build.gradle
自定義構(gòu)建系統(tǒng)屬性,你可以編輯當(dāng)前文件指定被應(yīng)用模塊使用的默認(rèn)構(gòu)建配置,同時(shí)可以指定你的密鑰庫、別名以便于構(gòu)建工具能夠在構(gòu)建釋放模式時(shí)簽署你的應(yīng)用。此文件是不可或缺的項(xiàng)目文件,以至于在項(xiàng)目源版本控制系統(tǒng)中進(jìn)行維護(hù)。
gradle.properties
項(xiàng)目全局Gradle配置。
gradlew
Unix的Gradle啟動(dòng)腳本。
gradlew.bat
Windows的Gradle啟動(dòng)腳本。
local.properties
自定義構(gòu)建系統(tǒng)的電腦屬性,例如:SDK安裝路徑。由于該文件的內(nèi)容是取決于本地安裝的SDK,該local.properties不應(yīng)在源版本控制系統(tǒng)進(jìn)行維護(hù)。
.iml
被IntelliJIDEA創(chuàng)建的模塊文件,用于保存模塊信息。
settings.gradle
指定要構(gòu)建的子項(xiàng)目。
二、Android視圖模式

Android模塊是最終被編譯到基于你構(gòu)建配置的apk文件的模塊。它們包括:項(xiàng)目源代碼、資源文件,默認(rèn)為你生成大部分的源碼、資源文件,然而其余的文件在需要時(shí)被創(chuàng)建。下面的目錄和文件構(gòu)成了Android應(yīng)用模塊:
build/
包括為指定構(gòu)建不同的文件夾,保存在主應(yīng)用模塊中。
libs/
包括所有的私有庫
src/
包括根目錄的Activity文件,該文件保存在:src/main/java//.java路徑下。其它源代碼文件(例如:.java或.aidl文件)也保存在這里。
main/java/com..
包含應(yīng)用于AppActivity的Java源代碼。
main/jni
包含正在使用的Java本地接口的本地代碼
main/gen
包含由AndroidStudio生成的文件,例如:R.java文件、從AIDL創(chuàng)建的接口文件。
main/assets
這個(gè)文件夾是空的,你可以使用它來保存原始的資產(chǎn)文件,你保存在這里的文件被編譯進(jìn)入apk文件中,同時(shí)原始的文件名被保留。可以使用的IRI以同樣的方式在此目錄導(dǎo)航作為一個(gè)典型的文件系統(tǒng),并使用AssetManager讀文件作為字節(jié)流。例如:這是紋理和游戲數(shù)據(jù)存放的好位置。
main/res
包含應(yīng)用的資源,比如:drawable文件,布局文件和字符串值在下面的目錄里。
anim/
關(guān)于那將被編譯成animation對象的XML文件
color/
關(guān)于描述colors的XML文件
drawable/
關(guān)于位圖文件、圖片和描述繪制圖形或繪制對象的XML文件包括多種狀態(tài)(標(biāo)準(zhǔn)、按下或聚焦)
mipmap/
關(guān)于APP啟動(dòng)的圖標(biāo),Android保留的這些資源在這個(gè)文件夾里(同時(shí)指定密度的文件夾,比如:mipmap-xxhdpi)不管你要安裝APP的設(shè)備的分辨率,這樣的方式使得啟動(dòng)app時(shí)為你APP應(yīng)用去選擇最好的分辨率在桌面屏幕上顯示。
layout/
關(guān)于將要被編譯到屏幕布局(或稱為屏幕一部分)的XML文件
menu/
關(guān)于定義應(yīng)用菜單的XML文件
raw/
關(guān)于原始的資產(chǎn)文件。保存在該文件夾中的資產(chǎn)文件本質(zhì)上和保存在assets/目錄下是一樣的。唯一的區(qū)別是你如何訪問它們。這些文件由aapt處理,同時(shí)必須由R類唯一標(biāo)識的應(yīng)用引用,例如:這個(gè)文件夾是放置媒體文件的好地方,比如 MP3或Ogg 文件。
values/
關(guān)于XML元素標(biāo)簽定義的XML文件。不像res/目錄下的其它資源,這些資源被寫入這個(gè)文件夾的XML文件不是通過文件名引用,而是XML元素標(biāo)簽控制在XML定義的文件怎么替換成R類
xml/
關(guān)于冗余的XML用于配置應(yīng)用組件的文件。例如:一個(gè)XML文件定義了PreferenceScreen,APPWidgetProviderInfo,或 SearchabilityMetadata。
AndroidManifest.xml/
該控制文件描述了當(dāng)前應(yīng)用和每一個(gè)組件的性質(zhì)。例如,它描述:有關(guān)activity,services,intent receivers,和content provider特有的性質(zhì);被請求的權(quán)限;必須的外在的庫;被需要的支持的API設(shè)備特性等等。
.gitignore/
指定被git忽略的文件。
app.iml/
IntelliJ IDEA?模塊。
build.gradle/
自定義構(gòu)建系統(tǒng)的屬性。你可以編輯當(dāng)前文件來重寫被manifest文件使用的默認(rèn)構(gòu)建配置,同時(shí)也可以設(shè)置你的密鑰庫、別名的位置以便于構(gòu)建工具能夠在構(gòu)建釋放模塊時(shí)簽名你的應(yīng)用。這是項(xiàng)目不可或缺的一個(gè)文件,以至于在原版本控制系統(tǒng)中維護(hù)。
proguard-rules.pro/
ProGuard的設(shè)置文件。
三、Packages視圖模式

當(dāng)前項(xiàng)目所有的文件夾,比如:android.support.v7.appcompat、cn.teachcourse.hzl.main,方便快速定位指定文件夾下的內(nèi)容
四、Scratches視圖模式
Scratches的意思是“劃痕;抓痕”,選中該下拉項(xiàng),底下無內(nèi)容
Android項(xiàng)目中的一些重要文件
*R.java文件
R.java是在建立項(xiàng)目時(shí)自動(dòng)生成的,這個(gè)文件是只讀模式的,不能更改。R.java文件中定義了一個(gè)類——R,R類中包含很多靜態(tài)類,且靜態(tài)類的名字都與res中的一個(gè)名字對應(yīng),即R類定義該項(xiàng)目所有資源的索引
通過R.java我們可以很快地查找我們需要的資源,另外編繹器也會(huì)檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會(huì)編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機(jī)占用的空間。
*AndroidManifest.xml文件
項(xiàng)目的總配置文件,記錄應(yīng)用中所使用的各種組件。這個(gè)文件列出了應(yīng)用程序所提供的功能,在這個(gè)文件中,你可以指定應(yīng)用程序使用到的服務(wù)(如電話服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等)。另外當(dāng)你新添加一個(gè)Activity的時(shí)候,也需要在這個(gè)文件中進(jìn)行相應(yīng)配置,只有配置好后,才能調(diào)用此Activity。AndroidManifest.xml將包含如下設(shè)置:application permissions、Activities、intent filters等。
調(diào)試Android程序
一、Android Studio Logcat的使用
?logcat的5大級別
info:普通信息
warning:警告
Error:錯(cuò)誤,常用
Debug:debug
Assert:斷言,沒用過
Verbose:冗余,基本沒用
輸出log的方法
為了快速找到我們需要的log,一般會(huì)在log的輸出信息前加“”###“,這樣便于查找

filter中設(shè)置,這樣可以快速找到需要的log

?二、用Toast顯示消息
Android中提供一種簡單的Toast消息提示框機(jī)制,可以在用戶點(diǎn)擊了某些按鈕后,提示用戶一些信息,提示的信息不能被用戶點(diǎn)擊,Toast的提示信息根據(jù)用戶設(shè)置的顯示時(shí)間后自動(dòng)消失。Toast的提示信息可以在調(diào)試程序的時(shí)候方便的顯示某些想顯示的東西。
有兩種方法創(chuàng)建Toast
第一種方法的Java代碼:
makeText(Context?context,?int?resId,?int?duration)
參數(shù):context是toast顯示在哪個(gè)上下文,通常是當(dāng)前Activity;resId指顯示內(nèi)容引用Resouce那條數(shù)據(jù),就是從R類中去指定顯示的消息內(nèi)容;duration指定顯示時(shí)間,Toast默認(rèn)有LENGTH_SHORT和LENGTH_LONG兩常量,分別表示短時(shí)間顯示和長時(shí)間顯示。
第二種方法的Java代碼:
makeText(Context?context,?CharSequence?text,?int?duration)
參數(shù)context和duration與第一個(gè)方法相同,參數(shù)text可以自己寫消息內(nèi)容。
用上面任意方法創(chuàng)建Toast對象之后調(diào)用方法show()即可顯示。
Toast?toast?=?Toast.makeText(ToastDemoActivity.this,?"這是一個(gè)普通的Toast!",?Toast.LENGTH_SHORT);toast.show();