前言
郭神出品,必屬精品,記得在剛做Android開發(fā)的時(shí)候,當(dāng)時(shí)買了Android第一行代碼第一版,看了之后感覺內(nèi)容通俗易懂,收獲頗多,當(dāng)時(shí)還不知道作者是郭神,后來在CSDN上看了很多他寫的文章,發(fā)現(xiàn)原來作者就是郭神,現(xiàn)在他出了第二版,果斷將書買了回來,書很早就看完了,今天將書籍翻了出來看了一下,決定將自己的想法給記錄一下.
第一章 開始啟程---你的第一行Android代碼
1.1 了解全貌------Android王國(guó)介紹
1.1.1 Android系統(tǒng)架構(gòu)
Android系統(tǒng)架構(gòu)大致可分為4層:
- Linux內(nèi)核層
- Android系統(tǒng)是基于Linux內(nèi)核的,這一層主要為Android設(shè)備提供了底層的驅(qū)動(dòng),如, 顯示驅(qū)動(dòng),音頻驅(qū)動(dòng),照相機(jī)驅(qū)動(dòng),藍(lán)牙驅(qū)動(dòng),Wi-Fi驅(qū)動(dòng),電源管理等
- 系統(tǒng)運(yùn)行庫(kù)層
- 這一層通過一些C/C++庫(kù)來為Android系統(tǒng)提供了主要的特性支持,如SQLite庫(kù)提供了數(shù)據(jù)庫(kù)的支持,OpenGL|ES庫(kù)提供了3D繪圖的支持,Webkit庫(kù)提供了瀏覽器內(nèi)核的支持等.
- 同樣在這一層還有Android運(yùn)行時(shí)庫(kù),它主要提供了一些核心庫(kù),能夠允許開發(fā)者使用Java語言來編寫Android應(yīng)用.另外,Android運(yùn)行時(shí)庫(kù)中還包含了Dalvik虛擬機(jī)(5.0系統(tǒng)之后改為ART運(yùn)行環(huán)境),它使得每一個(gè) Android應(yīng)用都能運(yùn)行在獨(dú)立的進(jìn)程當(dāng)中,并且擁有自己的一個(gè)Dalvik虛擬機(jī)實(shí)例.相較于Java虛擬機(jī).Davik是專門為移動(dòng)設(shè)備定制的旬薯,它針對(duì)手機(jī)內(nèi)存,CPU性能有限等情況做了優(yōu)化處理.
- 應(yīng)用框架層
- 這一層主要提供了構(gòu)建應(yīng)用程序時(shí)可能用到的各種API,Android自帶的一些核心應(yīng)用就是使用這些API完成的,開發(fā)者亦可以通過使用這些API來構(gòu)建自己的應(yīng)用程序.
- 應(yīng)用層
- 所有安裝在手機(jī)世聯(lián)行的應(yīng)用程序都是屬于這一層的,比如系統(tǒng)自帶的聯(lián)系人,短信等程序,或者是你從Google Play上下載的小游戲,當(dāng)然還包括你自己開發(fā)的程序.
結(jié)合下圖你將會(huì)理解更加深刻
1.1.2 Android已發(fā)布的版本
- Android操作系統(tǒng)是一個(gè)由Google和開放手持設(shè)備聯(lián)盟共同開發(fā)發(fā)展的移動(dòng)設(shè)備操作系統(tǒng),其最早的一個(gè)版本Android 1.0 beta發(fā)布于2007年11月5日呕诉,至今已經(jīng)發(fā)布了多個(gè)更新鲸匿。這些更新版本都在前一個(gè)版本的基礎(chǔ)上修復(fù)了Bug并且添加了前一個(gè)版本所沒有的新功能会烙。
- Android在正式發(fā)行之前典蜕,最開始擁有兩個(gè)內(nèi)部測(cè)試版本断盛,并且以著名的機(jī)器人名稱來對(duì)其進(jìn)行命名,它們分別是:鐵臂阿童木(Astro Boy愉舔,注意不是Astro阿童木)和發(fā)條機(jī)器人(Bender)钢猛。需要注意的是,Android 1.0和1.1的版本代號(hào)并不是這兩個(gè)轩缤,維基百科中的“Android Version History”詞條部分是錯(cuò)誤的命迈。 [3]
- 后來由于涉及到版權(quán)問題,谷歌將其命名規(guī)則變更為用甜點(diǎn)作為它們系統(tǒng)版本的代號(hào)的命名方法火的。Android 1.0是于2008年9月23日正式發(fā)布的Android第一版壶愤,Android 1.1發(fā)布于2009年2月2日,但其實(shí)谷歌內(nèi)部有更多的1.1版的變種馏鹤。甜點(diǎn)命名法開始于第三版Android 1.5(實(shí)際上是第四版征椒,因?yàn)锳ndroid 1.0其實(shí)有兩版)。而從Android 1.6 Donut甜甜圈開始湃累,項(xiàng)目組才正式確定將Android開發(fā)代號(hào)首字母從“C”一直延續(xù)下去勃救。值得一提的是,Android 1.1 的內(nèi)部代號(hào)為 Petit Four 治力,但項(xiàng)目主管喜歡美味的點(diǎn)心蒙秒,最終結(jié)束了這種命名方式。
所以Astro Boy和Bender都是真實(shí)的宵统,但他們都是在超早期的里程碑版本中進(jìn)行的,完整的時(shí)間表是這樣的:
Android milestone builds (with Astro Boy and Bender floating around in here somewhere)
Android 1.0(沒有開發(fā)代號(hào))
Android 1.1 - Petit Four
Android 1.5 - Cupcake
Android 1.6 - Donut
Android 2.0/2.1 - éclair
Android 2.2 - Froyo
Android 2.3 - Gingerbread
Android 3.0/3.1/3.2 - Honeycomb
Android 4.0 - Ice Cream Sandwich
Android 4.1/4.2/4.3 - Jelly Bean
Android 4.4 - KitKat
Android 5.0/5.1 - Lollipop(Android L)
Android 6.0 - Marshmallow(Android M)
Android 7.0 -Nougat(Android N)
Android 8.0 -Oreo(Android O)
隨著版本的更迭晕讲,應(yīng)用程序編程接口(API)等級(jí)不斷發(fā)生。下面將目前為止所有API等級(jí)羅列出來,并與Android各版本一一對(duì)應(yīng)益兄。
API等級(jí)1:Android 1.0
API等級(jí)2:Android 1.1 Petit Four
API等級(jí)3:Android 1.5 Cupcake
API等級(jí)4:Android 1.6 Donut
API等級(jí)5:Android 2.0 éclair
API等級(jí)6:Android 2.0.1 éclair
API等級(jí)7:Android 2.1 éclair
API等級(jí)8:Android 2.2 - 2.2.3 Froyo
API等級(jí)9:Android 2.3 - 2.3.2 Gingerbread
API等級(jí)10:Android 2.3.3-2.3.7 Gingerbread
API等級(jí)11:Android 3.0 Honeycomb
API等級(jí)12:Android 3.1 Honeycomb
API等級(jí)13:Android 3.2 Honeycomb
API等級(jí)14:Android 4.0 - 4.0.2 Ice Cream Sandwich
API等級(jí)15:Android 4.0.3 - 4.0.4 Ice Cream Sandwich
API等級(jí)16:Android 4.1 Jelly Bean
API等級(jí)17:Android 4.2 Jelly Bean
API等級(jí)18:Android 4.3 Jelly Bean
API等級(jí)19:Android 4.4 KitKat
API等級(jí)20:Android 4.4W
API等級(jí)21:Android 5.0 Lollipop
API等級(jí)22:Android 5.1 Lollipop
API等級(jí)23:Android 6.0 Marshmallow
API等級(jí)24:Android 7.0 Nougat
API等級(jí)25:Android 7.1 Nougat
API等級(jí)26:Android 8.0 Oreo
1.1.3 Android應(yīng)用開發(fā)特色
- 四大組件
- Android四大組件分別是活動(dòng)(Activity),服務(wù)(Service),廣播接收器(Broadcast Receiver)和內(nèi)容提供器(Content Provider).其中活動(dòng)是所有Android應(yīng)用程序的門面,凡是在應(yīng)用中你看得到的東西,都是放在活動(dòng)中的,而服務(wù)就比較低調(diào)了.你無法看到它,但它會(huì)一直在后臺(tái)默默地運(yùn)行,即使用戶退出了應(yīng)用,服務(wù)仍然可以繼續(xù)的運(yùn)行的.廣播接收器允許你的應(yīng)用接收來自各處的廣播消息,比如電話,短信等,當(dāng)然你的應(yīng)用同樣也可以向外發(fā)出廣播消息.內(nèi)容提供器則為應(yīng)用程序之間共享數(shù)據(jù)提供了可能,比如你想要讀取系統(tǒng)電話簿中的聯(lián)系人,就需要通過內(nèi)容提供器來實(shí)現(xiàn).
- 豐富的系統(tǒng)控件
- Andriod系統(tǒng)為開發(fā)者提供了豐富的系統(tǒng)控件,使得我們可以很輕松地編寫出漂亮的界面.當(dāng)然如果你品位比較高,不滿足系統(tǒng)自帶的控件效果,也完全可以定制屬于自己的控件.
- SQLite數(shù)據(jù)庫(kù)
- Android系統(tǒng)自帶了這種輕量級(jí),運(yùn)算速度極快的嵌入式關(guān)系型數(shù)據(jù)庫(kù), 它不僅支持標(biāo)準(zhǔn)的SQL語法,還可以通過Android封裝好的API進(jìn)行操作,讓存儲(chǔ)和讀取數(shù)據(jù)變得非常方便
- 強(qiáng)大的多媒體
- Android系統(tǒng)還提供了豐富的多媒體服務(wù).如音樂,視頻,錄音,拍照,鬧鈴,等等,這一切你可以在程序中通過代碼進(jìn)行控制,讓你的應(yīng)用變得更加豐富多彩.
-
地理位置定位
移動(dòng)設(shè)備和PC相比起來,地理位置定位功能應(yīng)該可以算是很大的一個(gè)亮點(diǎn),現(xiàn)在的Android手機(jī)都內(nèi)置了GPS,走到哪兒都可以定位自己的位置,發(fā)揮你的想象就可以做出創(chuàng)意十足的應(yīng)用,如果在結(jié)合功能強(qiáng)大的地圖功能,LBS這一領(lǐng)域潛力無限.
1.2 手把手帶你搭建開發(fā)環(huán)境
1.2.1 準(zhǔn)備所需要的工具
- JDK
- Android SDK
- Android Studio
1.2.1 搭建開發(fā)環(huán)境
- Android Studio的安裝過程
1.3 創(chuàng)建你的第一個(gè)Android項(xiàng)目
任何一個(gè)編程語言的第一個(gè)程序毫無疑問都會(huì)是Hello World,這已經(jīng)是20世紀(jì)70年代一直流傳下來的傳統(tǒng),在編程界已成為永恒的經(jīng)典.
1.3.1 創(chuàng)建HelloWorld項(xiàng)目
1.3.2 啟動(dòng)模擬器
1.3.3 運(yùn)行HelloWorld
1.3.4 分析你的第一個(gè)Android程序
這里我們將項(xiàng)目結(jié)構(gòu)模式切換成Project,這就是項(xiàng)目的真實(shí)目錄結(jié)構(gòu)
-
.gradle和.idea
這兩個(gè)目錄下放置的都是Android Studio自動(dòng)生成的一些文件,我們無須關(guān)心,也不要去手動(dòng)編輯. -
app
項(xiàng)目中的代碼,資源等內(nèi)容幾乎都是放置在這個(gè)目錄下的,我們后面的開發(fā)工作也基本都是在這個(gè)目錄下進(jìn)行的,待會(huì)兒還會(huì)對(duì)這個(gè)目錄單獨(dú)展開進(jìn)行講解. -
build
它主要包含了一些編譯時(shí)自動(dòng)生成的文件 -
gradle
這個(gè)目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle下載好,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle.Android Studio默認(rèn)沒有啟用gradle wrapper的方式,如果需要打開,可以點(diǎn)擊Android Studio導(dǎo)航欄-->File-->Settings-->Build,Execution,Deployment-->Gradle,進(jìn)行配置更改. -
.gitignore
這個(gè)文件是用來將指定的文件排除在版本控制之外的. -
build.gradle
這是項(xiàng)目全局的gradle構(gòu)建腳本,通常這個(gè)文件中的內(nèi)容是不需要修改的. -
gradle.properties
這個(gè)文件是全局的gradle配置文件, 在這里配置的屬性將會(huì)影響到項(xiàng)目中所有的gradle編譯腳本.
8, gradlew和gradlew.bat
這兩個(gè)文件是用來命令行界面中執(zhí)行g(shù)radle命令的,其中g(shù)radlew是在Linux或Mac系統(tǒng)中使用的,gradlew.bat是在Windows中使用的. -
HelloWorld.iml
img文件是所有IntelliJ IDEA項(xiàng)目都會(huì)自動(dòng)生成的一個(gè)文件(Android Studio是基于IntelliJ IDEA開發(fā)的),用于標(biāo)識(shí)這是一個(gè)IntelliJ IDEA項(xiàng)目,我們不需要修改這個(gè)文件中的任何內(nèi)容. -
local.properties
這個(gè)文件用于指定Android SDK路徑,通常內(nèi)容都是自動(dòng)生成的,我們并不需要修改,除非你本機(jī)中的Android SDK位置發(fā)生了變化 ,那么就將這個(gè)文件中的路徑改成新的位置即可. -
settings.gradle
這個(gè)文件用于指定項(xiàng)目中所有引入的模塊,由于HelloWorld項(xiàng)目中就只有一個(gè)app模塊,因此這個(gè)文件中也就只引入了一個(gè)模塊,通常情況下模塊的引入都是自動(dòng)完成的,需要我們手動(dòng)去修改這個(gè)文件的場(chǎng)景可能表較少
app目錄, 如圖:
那么下面我們就來對(duì)app目錄下的內(nèi)容進(jìn)行更為詳細(xì)的分析
-
build
這個(gè)目錄和 外層的build目錄類似,主要也是包含了一些在編譯時(shí)自動(dòng)生成的文件,不過它里面的內(nèi)容更多更雜,我們不需要過多關(guān)心 -
libs
如果你的項(xiàng)目中使用到了第三方j(luò)ar包,就需要把這些jar包都放在libs目錄下,放在這個(gè)目錄下的jar包都會(huì)被自動(dòng)添加到構(gòu)建路徑里去 -
androidTest
此處是用來編寫Android Test測(cè)試用例的.可以對(duì)項(xiàng)目進(jìn)行一些自動(dòng)化測(cè)試 -
java
毫無疑問,java目錄是放置我們所有Java代碼的地方,展開該目錄,你將看到我們剛才創(chuàng)建的HelloWorldActivity文件就在里面 -
res
項(xiàng)目中使用到的所有圖片,布局,字符串等資源都要存放在這個(gè)目錄下.當(dāng)然這個(gè)目錄下還有很多子目錄,圖片放在drawable目錄下,布局放在layout目錄下,字符串放在values目錄下,所以你不用擔(dān)心會(huì)把整個(gè)res目錄弄得亂糟糟的.
6, Androidmanifest.xml
這是你整個(gè)Android項(xiàng)目的配置文件,你在程序中定義的四大組件都需要在這個(gè)文件里注冊(cè),另外還可以在這個(gè)文件中給應(yīng)用添加權(quán)限聲明,由于這個(gè)文件以后會(huì)進(jìn)場(chǎng)用到,我們用到的時(shí)候再做詳細(xì)說明. -
test
此處是用來編寫Unit Test測(cè)試用例的. 是對(duì)項(xiàng)目進(jìn)行自動(dòng)化測(cè)試的另一種方式. -
.gitigmore
這個(gè)文件用于將app模塊內(nèi)的指定的目錄或文件排除在版本控制之外,作用和外層的.gitignore文件類似 -
app.iml
IntelliJ IDEA項(xiàng)目自動(dòng)生成的文件, 我們不需要關(guān)心或修改這個(gè)文件中的內(nèi)容 -
build.gradle
這是app模塊的gradle構(gòu)建腳本,這個(gè)文件中會(huì)指定很多項(xiàng)目構(gòu)建相關(guān)的配置,我們稍后將會(huì)詳細(xì)分析gradle構(gòu)建腳本中的具體內(nèi)容 - proguard-rules.pro
這個(gè)文件用于指定項(xiàng)目代碼的混淆規(guī)則,當(dāng)代碼開發(fā)完成后打成安裝包文件,如果不希望代碼被別人破解,通常會(huì)將代碼進(jìn)行混淆,從而讓破解者難以閱讀.
1.3.5 詳解項(xiàng)目中的資源
所有以drawable開頭的文件夾都是用來放圖片的,所有以mipmap開頭的文件夾都是用來放應(yīng)用圖標(biāo)的,所有以values開頭的文件夾都是用來放字符串锻梳,樣式,顏色等配置的,layout文件夾是用來放布局文件的.
之所以這么多mipmap開頭的文件夾,其實(shí)主要是為了讓程序能夠更好地兼容各種設(shè)備.drawable文件夾也是同樣的道理
drawable-v24和mipmap-anydpi-v26是為了適配Android8.0系統(tǒng)應(yīng)用圖標(biāo)而自動(dòng)生成的
-
打開values/string.xml,內(nèi)容如下
<resources> <string name="app_name">HelloWorld</string> </resources>
可以看到, 這里定義了一個(gè)應(yīng)用程序名的字符串,我們有以下兩種方式來引用它.
- 在代碼中通過R.string.app_name可以獲得該字符串的引用.
- 在XML中通過@string/app_name可以獲得該字符串的引用.
-
打開AndroidManifest.xml文件,找到如下代碼:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> </application>
其中,HelloWorld項(xiàng)目的應(yīng)用圖標(biāo)就是通過android:icon屬性來指定的,應(yīng)用的名稱則是通過android:label屬性指定的.可以看到,這里對(duì)資源引用的方式正式我們剛剛學(xué)過的在XML中引用資源的語法.
1.3.6 詳解build.gradle文件
-
先來看下外層目錄下build.gradle文件,代碼如下所示:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
- repositories的閉包中都聲明了 google(),jcenter()這兩個(gè)配置,那么這個(gè)jcenter和google是什么意思呢?其實(shí)它們是一個(gè)代碼托管倉(cāng)庫(kù),很多Android開源項(xiàng)目選擇將代碼托管到j(luò)center和google上,聲明了這些配置后,我們就可以在項(xiàng)目中引用任何jcenter和google上的開源項(xiàng)目了.
- dependencies閉包中使用Classpath聲明了一個(gè)Gradle插件,為什么要聲明這個(gè)插件呢?因?yàn)镚radle并不是在專門為構(gòu)建Android項(xiàng)目而開發(fā)的,Java,C++等很多中項(xiàng)目都可以使用Gradle來構(gòu)建,因此如果要構(gòu)建Android項(xiàng)目,則需要聲明 classpath 'com.android.tools.build:gradle:3.0.1'這個(gè)插件,其中,最后面的部分是版本號(hào).
-
app目錄下的build.gradle文件
apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.dream.helloworld" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' }
- 這個(gè)文件中的內(nèi)容相對(duì)復(fù)雜一些,com.android.application表示這是一個(gè)應(yīng)用程序模塊,com.android.library表示這是一個(gè)庫(kù).
- android閉包,compileSdkVersion用于指定項(xiàng)目的編譯版本
- defaultConfig閉包,applicationId用于指定項(xiàng)目的包名,minSdkVersion用于指定項(xiàng)目最低兼容的Android系統(tǒng)版本,targetSdkVersion指定的值表示你在改在該目標(biāo)版本上已經(jīng)做過了充分的測(cè)試,versionCode用于指定版本號(hào),versionName用戶指定版本名稱
- buildTypes閉包,用于指定生成安裝文件的相關(guān)配置,通常會(huì)有兩個(gè)子閉包,一個(gè)是debug,一個(gè)是release,debug閉包是可以忽略不寫的,因此上面的代碼中只有一個(gè)release閉包.minifyEnabled用于是否開啟混淆,為true表示開啟混淆,為false表示不混淆.
- dependencies閉包,這個(gè)閉包功能非常強(qiáng)大,它可以指定當(dāng)前項(xiàng)目所有的依賴關(guān)系,通常Android Studio項(xiàng)目一共有3中依賴方式:本地依賴,庫(kù)依賴,遠(yuǎn)程依賴.第一行的 implementation fileTree(dir: 'libs', include: ['*.jar'])就是一個(gè)本地依賴,而第二行的 implementation 'com.android.support:appcompat-v7:26.1.0'就是一個(gè)遠(yuǎn)程依賴,像compile project這種的就是庫(kù)依賴.testImplementation 'junit:junit:4.12'是用來聲明測(cè)試用例庫(kù)的.
1.4 前行必備------掌握日志工具的使用
- Log.v(); 對(duì)應(yīng)級(jí)別verbose,是Android日志里面級(jí)別最低的那一種
- Log.d(); 對(duì)應(yīng)級(jí)別debug,比verbose高一級(jí)
- Log.i(); 對(duì)應(yīng)級(jí)別info,比debug高一級(jí)
- Log.w();對(duì)應(yīng)級(jí)別warn,比info高一級(jí)
- Log.e(); 對(duì)應(yīng)級(jí)別error,比warn高一級(jí)
logcat中還能使用和添加過濾器
1.5 小結(jié)
以上就是Android第一行代碼第一章的全部?jī)?nèi)容,書中寫的比較細(xì)致,很全面,同時(shí)收貨也很多.