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