====================================
====== 第一章:開(kāi)始啟程 ======
====================================
Android四層架構(gòu):Linux內(nèi)核層(硬件)、系統(tǒng)運(yùn)行庫(kù)層(底層類(lèi)庫(kù))、應(yīng)用框架層(框架)诵原、應(yīng)用層
繼續(xù)書(shū)籍:學(xué)習(xí)一下JavaSE的基礎(chǔ)案淋。然后就可以直接看“第一行代碼第二版”
四大組件:
活動(dòng)(activity)妓湘、應(yīng)用程序的門(mén)面员咽,看得見(jiàn)摸得著的東西
服務(wù)(service)妆兑、后臺(tái)默默運(yùn)行的就是服務(wù)惹骂,即使用戶(hù)退出了應(yīng)用苏携,仍可以繼續(xù)運(yùn)行
廣播接收器(broadcast receiver)、允許接受各處的廣播消息对粪,電話右冻、短信等
內(nèi)容提供器(content provider)、為應(yīng)用程序之間共享數(shù)據(jù)(比如獲取電話簿中聯(lián)系人)
搭建開(kāi)發(fā)環(huán)境:按照網(wǎng)上的教程即可衩侥。書(shū)籍不一定是最新的国旷。針對(duì)Mac。先安裝JDK即可茫死,我下載的是1.8的跪但。然后安裝Android Studio(Android的開(kāi)發(fā)工具,然后按照步驟峦萎,無(wú)需做額外的設(shè)置就可以運(yùn)行了)
目錄結(jié)構(gòu)解釋?zhuān)?br> 看一下項(xiàng)目的結(jié)構(gòu)屡久,我們的主要活動(dòng)都在src文件夾里面。
.gradle爱榔、.idea目錄:都是放置Android studio這個(gè)開(kāi)發(fā)工具自動(dòng)生成的一些文件被环,無(wú)需關(guān)心,不要手動(dòng)編輯详幽。
App:項(xiàng)目中的代碼資源都在這個(gè)目錄下筛欢,等會(huì)會(huì)詳細(xì)解釋。我們最主要關(guān)心的就是這個(gè)目錄唇聘。
gradle:這個(gè)目錄下包含了gradle wrapper的配置文件版姑。Android studio默認(rèn)沒(méi)有啟用gradle wrapper的方式。不明白迟郎,后面以后可能會(huì)解釋剥险。
.gitignore:很明顯這是用于版本管理控制的忽略文件的。
ActivityTest.iml:iml文件是所有IntelliJ JDEA項(xiàng)目都會(huì)自動(dòng)生成的一個(gè)文件(Android Studio就是基于IntelliJ JDEA開(kāi)發(fā)的)宪肖,這個(gè)用于標(biāo)識(shí)這是一個(gè)IntelliJ IDEA項(xiàng)目)表制。
Build.gradle:項(xiàng)目全局的gradle構(gòu)建腳本健爬,通常這個(gè)文件中的內(nèi)容是不需要修改的。
Gradle.properties:全局的gradle配置文件么介,在這個(gè)文件配置的屬性會(huì)影響到項(xiàng)目中所有的gradle編譯腳本
gradlew和gradlew.bat:用來(lái)在命令行界面中執(zhí)行g(shù)radle命令娜遵,其中g(shù)radlew是在Linux或Mac系統(tǒng)中使用的,gradlew.bat是在Windows系統(tǒng)中使用壤短。
Local.properties:用于指定Android SDK路徑魔熏,通常內(nèi)容都是自動(dòng)生成的,不需要修改鸽扁,除非你本機(jī)中的AndroidSDK位置發(fā)生了改變蒜绽。那么改為新的位置即可。
Settings.gradle:用于指定項(xiàng)目中所有引入的模塊桶现。由于項(xiàng)目中只有一個(gè)app模塊躲雅。因此該文件只引入了app這一個(gè)模塊,通常模塊也是自動(dòng)完成的不需要我們手動(dòng)去修改骡和。
詳細(xì)介紹app目錄:
Build目錄:包含一些在編譯時(shí)自動(dòng)生成的文件相赁,我們無(wú)需關(guān)心。
Libs目錄:如果項(xiàng)目用到了第三方j(luò)ar包慰于,就需要把這些jar包放到libs目錄下钮科,放在這個(gè)目錄下的jar包會(huì)被自動(dòng)添加到構(gòu)建路徑里。
Src目錄婆赠,最主要的目錄:
androidTest:用于編寫(xiě)Android測(cè)試用例的绵脯。
main里面:
Androidmannifest.xml:整個(gè)Android項(xiàng)目的配置文件,你在程序中定義的所有四大組件都需要在這個(gè)文件里注冊(cè)休里,另外還可以給應(yīng)用程序添加權(quán)限聲明等等蛆挫。
Test:編寫(xiě)單元測(cè)試用例的。
proguard_rules.pro:用于指定項(xiàng)目代碼的混淆規(guī)則妙黍。
Java:放置我們素有java代碼的地方悴侵,比如關(guān)聯(lián)我們activity的java代碼就在這里。
Res:資源目錄:
drawable用來(lái)存放圖片的拭嫁。
Mipmap開(kāi)頭的用來(lái)存放圖標(biāo)的可免。(多個(gè)文件夾主要用于適配多種機(jī)型不同分辨率)
Values開(kāi)頭的用來(lái)存放字符串、樣式做粤、顏色等配置的浇借。
Layout用來(lái)存放布局文件的。
看一下Manifest.xml文件驮宴。沒(méi)有在Manifest.xml中注冊(cè)的活動(dòng)是不能使用的逮刨。
Activity是Android系統(tǒng)提供的一個(gè)活動(dòng)的基類(lèi)呕缭,我們項(xiàng)目中所有的活動(dòng)都必須繼承它或它的子類(lèi)才能擁有活動(dòng)的特性)(AppCoompatctivity是Activity的子類(lèi))
onCreate()方法堵泽,是一個(gè)活動(dòng)被創(chuàng)建時(shí)必定會(huì)執(zhí)行的方法修己。
setContentView()方法,就是這個(gè)方法給當(dāng)前的活動(dòng)引入了一個(gè)hello_world_layout布局迎罗,(在res/layout目錄下可以找到hello_world_layout.xml這個(gè)文件)
打開(kāi)這個(gè)xml文件并切換到Text視圖睬愤。(底部可以看到切換“design”和“text”兩種視圖)
再看一下src/res目錄中:
drawable開(kāi)頭的文件夾是用來(lái)存放圖片的。(有多個(gè)文件夾也是為了適配各種設(shè)備纹安,我們也可以自己創(chuàng)建drawable-hdpi尤辱、drawable-xhdpi等等文件夾。)
所有以mipmap開(kāi)頭的文件夾都是用來(lái)存放應(yīng)用圖標(biāo)的厢岂。(之所有有這么多個(gè)文件開(kāi)頭是為了更好的適配各種機(jī)型)
所有以values開(kāi)頭的文件夾都是用來(lái)存放字符串光督、樣式、顏色等配置的塔粒,
layout文件夾是用來(lái)存放布局文件的结借。
當(dāng)程序運(yùn)行時(shí),會(huì)自動(dòng)根據(jù)當(dāng)前運(yùn)行設(shè)備分辨率的高低選擇加載哪個(gè)文件夾下的圖片卒茬。(如果美工只提供給我們一份圖片船老,這時(shí)我們把圖片放在drawable-xxhdpi中即可)
1、修改一下values文件夾下的strings.xml文件
<resources>
<string name=“app_name”>HelloWorld<string/>
</resources>
A圃酵、在代碼中可以通過(guò)R.string.app_name可以獲得該字符串的引用
B柳畔、在xml中通過(guò)@string/app_name可以獲得該字符串的引用
其實(shí)基本語(yǔ)法就是A、B這兩種方式郭赐。其中string部分是可以替換的薪韩,如果是引用圖片資源,可以替換成drawable捌锭。如果是引用應(yīng)用圖標(biāo)躬存,可以替換成mipmap。如果是引用布局文件舀锨,可以替換成
這時(shí)候解釋一下AndroidManifest.xml文件:
<application
android:allowBackup:”true”
android:icon=“@mipmap/ic_la”
android:label=“@string/app_name”
android:supportsRtl=“true”
android:theme=“@style/AppTheme”>
…
</application>
其中岭洲,HelloWorld項(xiàng)目的應(yīng)用圖標(biāo)是通過(guò)android:icon屬性類(lèi)指定的,應(yīng)用名稱(chēng)由android:label屬性指定的坎匿,
詳解build.gradel文件:
不同于Eclipse盾剩,Android Studio是采用Gradle來(lái)構(gòu)建項(xiàng)目的。gradle是一個(gè)非常先進(jìn)的項(xiàng)目構(gòu)建工具替蔬。它使用了一種基于groovy的領(lǐng)域特定語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置告私,摒棄了傳統(tǒng)基于xml(如ant和maven)的各種繁瑣配置。
HelloWorld項(xiàng)目中有兩個(gè)build.gradle文件承桥,一個(gè)是最外層目錄下驻粟,一個(gè)是在app目錄下。這兩個(gè)文件對(duì)構(gòu)建android studio項(xiàng)目起到至關(guān)重要的作用。
1蜀撑、最外層的build.gradle文件:
buildscript {
respsitories {
// 代碼托管倉(cāng)庫(kù)挤巡,聲明之后,我們就可以在項(xiàng)目中輕松引用jcenter上的開(kāi)源項(xiàng)目了
jcenter()
}
dependencies {
// 聲明一個(gè)gradle插件酷麦。因?yàn)間radle并不是專(zhuān)門(mén)為android而生的矿卑,要想使用它構(gòu)建android項(xiàng)目,就需要聲明以下的插件
classpath ‘com.android.tools.build:gradle:2.2.0’
}
}
allprojects {
repositories {
jcenter()
}
}
這些代碼都是自動(dòng)生成的沃饶。
2母廷、app目錄下的build.gradle文件:
// 定義了一個(gè)插件(一般有兩種值可選,com.android.library表示這是一個(gè)庫(kù)模塊糊肤,application表示是一個(gè)應(yīng)用模塊琴昆,應(yīng)用模塊可以直接運(yùn)行,庫(kù)模塊只能作為代碼庫(kù)依附于別的應(yīng)用程序模塊來(lái)運(yùn)行馆揉。
apply plugin: ‘com.android.application’
// android閉包
android {
// 編譯版本
compileSdkVersion 24
// 構(gòu)建工具的版本椎咧,如果有更新的版本,android studio會(huì)有提示
buildToolsVersion “24.0.2”
defaultConfig {
// 項(xiàng)目的包名把介,前面其實(shí)我們已經(jīng)指定過(guò)包名勤讽,如果想在后面對(duì)其修改,就是在這里修改拗踢。
appliationId “com.example.helloworld”
// 最低sdk的版本脚牍,15表示最低兼容到android4.0
minSdkVersion 15
// 表示你在該版本上已經(jīng)做過(guò)了充分的測(cè)試,系統(tǒng)將會(huì)為你的應(yīng)用程序啟用一些最新的功能和特性(如果是23以上巢墅,系統(tǒng)會(huì)為你的程序啟用運(yùn)行時(shí)權(quán)限功能)
tragetSdkVersion 24
// 版本號(hào)
versionCode 1
// 版本名
versionName “1.0”
}
// 用于指定安裝文件的配置
buildTypes {
release {
// 用于是否對(duì)項(xiàng)目代碼進(jìn)行混淆诸狭。true表示混淆,false表示不混淆
minifyEnabled false
// 混淆時(shí)使用的規(guī)則文件君纫,這里指定了兩個(gè)文件
proguardFiles getDefaultProguardFile(‘proguard-android.txt’),’proguard.rules.pro’
}
// debug表示測(cè)試版驯遇,可以忽略不寫(xiě)
}
}
// 可以指定當(dāng)前項(xiàng)目所有的依賴(lài)關(guān)系,通常項(xiàng)目一共有三種依賴(lài)方式蓄髓,1叉庐、本地依賴(lài)。2会喝、庫(kù)依賴(lài)陡叠。3、遠(yuǎn)程依賴(lài)肢执。
// 本地依賴(lài)可以對(duì)本地的jar包或目錄添加依賴(lài)關(guān)系
// 庫(kù)依賴(lài)可以對(duì)項(xiàng)目中的庫(kù)模塊添加依賴(lài)關(guān)系
// 遠(yuǎn)程依賴(lài)可以對(duì)jcenter庫(kù)上的開(kāi)源項(xiàng)目添加依賴(lài)關(guān)系
dependencies {
// 這是本地依賴(lài)枉阵,它將libs目錄下所有.jar后綴的文件都添加到項(xiàng)目的構(gòu)建路徑中。
compile fileTree(dir:’libs’, include: [‘*.jar’])
// 遠(yuǎn)程依賴(lài)聲明预茄,加上這個(gè)聲明兴溜,gradle在構(gòu)建項(xiàng)目時(shí)會(huì)首先檢查一下本地是否已經(jīng)有這個(gè)庫(kù)的緩存,如果沒(méi)有的話就會(huì)去自動(dòng)聯(lián)網(wǎng)下載,然后再添加到項(xiàng)目的構(gòu)建路徑中
compile ‘com.android.support:appcompat-v7:24.2.1’
// 用于單元測(cè)試用例庫(kù)的
testCompile ‘junit:junit:4.12’
}
日志工具類(lèi):Log(android.util.Log)拙徽,以下五個(gè)方法供我們打印日志刨沦。
Log.v() 用于打印最瑣碎的意義最小的日志信息。對(duì)應(yīng)級(jí)別verbose斋攀,是android日志里面級(jí)別最低的一種。
Log.d() 用于打印一些調(diào)試信息梧田,對(duì)調(diào)試和分析問(wèn)題有幫助淳蔼。對(duì)應(yīng)級(jí)別debug,比verbose高一級(jí)
Log.i() 用于打印一些比較重要的數(shù)據(jù)裁眯,可以幫你分析用戶(hù)行為數(shù)據(jù)鹉梨。對(duì)應(yīng)界別info,比debug高一級(jí)
Log.w() 用于打印一些警告信息穿稳,提示程序這個(gè)地方可能存在潛在風(fēng)險(xiǎn)存皂。對(duì)應(yīng)級(jí)別warn,比info高一級(jí)
Log.e() 用于打印一些錯(cuò)誤信息逢艘,比如程序進(jìn)入了catch語(yǔ)句中旦袋,代表你的程序出現(xiàn)嚴(yán)重問(wèn)題了,必須盡快修復(fù)它改。對(duì)應(yīng)級(jí)別error疤孕,比warn高一級(jí)。
貌似還有一個(gè)assert央拖,
不建議用System.out.println()來(lái)輸出日志祭阀,android studio已經(jīng)不支持syso的快捷輸入了。輸入logd鲜戒,再點(diǎn)tab鍵专控,就可以自動(dòng)補(bǔ)全
如在onCreate()方法的外面輸入logt,然后按下tab鍵遏餐,就可以以當(dāng)前的類(lèi)名為值自動(dòng)生成一個(gè)Tag常量伦腐。
如下所示:
private static final String TAG = "HelloWorldActivity";
Logcat可以輕松添加過(guò)濾器,運(yùn)行項(xiàng)目之后失都,從Android studio中的底部可以很容易看到logcat蔗牡。