讀后感-Android第一行代碼第二版(1)

前言

郭神出品,必屬精品,記得在剛做Android開發的時候,當時買了Android第一行代碼第一版,看了之后感覺內容通俗易懂,收獲頗多,當時還不知道作者是郭神,后來在CSDN上看了很多他寫的文章,發現原來作者就是郭神,現在他出了第二版,果斷將書買了回來,書很早就看完了,今天將書籍翻了出來看了一下,決定將自己的想法給記錄一下.

第一章 開始啟程---你的第一行Android代碼

1.1 了解全貌------Android王國介紹

1.1.1 Android系統架構

Android系統架構大致可分為4層:

  1. Linux內核層
  • Android系統是基于Linux內核的,這一層主要為Android設備提供了底層的驅動,如, 顯示驅動,音頻驅動,照相機驅動,藍牙驅動,Wi-Fi驅動,電源管理等
  1. 系統運行庫層
  • 這一層通過一些C/C++庫來為Android系統提供了主要的特性支持,如SQLite庫提供了數據庫的支持,OpenGL|ES庫提供了3D繪圖的支持,Webkit庫提供了瀏覽器內核的支持等.
  • 同樣在這一層還有Android運行時庫,它主要提供了一些核心庫,能夠允許開發者使用Java語言來編寫Android應用.另外,Android運行時庫中還包含了Dalvik虛擬機(5.0系統之后改為ART運行環境),它使得每一個 Android應用都能運行在獨立的進程當中,并且擁有自己的一個Dalvik虛擬機實例.相較于Java虛擬機.Davik是專門為移動設備定制的,它針對手機內存,CPU性能有限等情況做了優化處理.
  1. 應用框架層
  • 這一層主要提供了構建應用程序時可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的,開發者亦可以通過使用這些API來構建自己的應用程序.
  1. 應用層
  • 所有安裝在手機世聯行的應用程序都是屬于這一層的,比如系統自帶的聯系人,短信等程序,或者是你從Google Play上下載的小游戲,當然還包括你自己開發的程序.

結合下圖你將會理解更加深刻


Android系統架構
1.1.2 Android已發布的版本
  • Android操作系統是一個由Google開放手持設備聯盟共同開發發展的移動設備操作系統,其最早的一個版本Android 1.0 beta發布于2007年11月5日,至今已經發布了多個更新。這些更新版本都在前一個版本的基礎上修復了Bug并且添加了前一個版本所沒有的新功能。
  • 從2009年5月開始,Android操作系統改用甜點來作為版本代號,這些版本按照從C大寫字母開始的順序來進行命名:紙杯蛋糕(Cupcake)、甜甜圈(Donut)、閃電泡芙(éclair)、凍酸奶(Froyo)、姜餅(Gingerbread)、蜂巢(Honeycomb)﹑冰淇淋三明治(Ice Cream Sandwich)、果凍豆(Jelly Bean)、奇巧(KitKat)、棒棒糖(Lollipop)、棉花糖(Marshmallow)、牛軋糖(Nougat)、奧利奧(Oreo)。
  • Android在正式發行之前,最開始擁有兩個內部測試版本,并且以著名的機器人名稱來對其進行命名,它們分別是:鐵臂阿童木(Astro Boy,注意不是Astro阿童木)和發條機器人(Bender)。需要注意的是,Android 1.0和1.1的版本代號并不是這兩個,維基百科中的“Android Version History”詞條部分是錯誤的。 [3]
  • 后來由于涉及到版權問題,谷歌將其命名規則變更為用甜點作為它們系統版本的代號的命名方法。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 BoyBender都是真實的,但他們都是在超早期的里程碑版本中進行的,完整的時間表是這樣的:

  • 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應用開發特色
  1. 四大組件
  • Android四大組件分別是活動(Activity),服務(Service),廣播接收器(Broadcast Receiver)和內容提供器(Content Provider).其中活動是所有Android應用程序的門面,凡是在應用中你看得到的東西,都是放在活動中的,而服務就比較低調了.你無法看到它,但它會一直在后臺默默地運行,即使用戶退出了應用,服務仍然可以繼續的運行的.廣播接收器允許你的應用接收來自各處的廣播消息,比如電話,短信等,當然你的應用同樣也可以向外發出廣播消息.內容提供器則為應用程序之間共享數據提供了可能,比如你想要讀取系統電話簿中的聯系人,就需要通過內容提供器來實現.
  1. 豐富的系統控件
  • Andriod系統為開發者提供了豐富的系統控件,使得我們可以很輕松地編寫出漂亮的界面.當然如果你品位比較高,不滿足系統自帶的控件效果,也完全可以定制屬于自己的控件.
  1. SQLite數據庫
  • Android系統自帶了這種輕量級,運算速度極快的嵌入式關系型數據庫, 它不僅支持標準的SQL語法,還可以通過Android封裝好的API進行操作,讓存儲和讀取數據變得非常方便
  1. 強大的多媒體
  • Android系統還提供了豐富的多媒體服務.如音樂,視頻,錄音,拍照,鬧鈴,等等,這一切你可以在程序中通過代碼進行控制,讓你的應用變得更加豐富多彩.
  1. 地理位置定位
    移動設備和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,這就是項目的真實目錄結構


Project模式的項目結構
  1. .gradle和.idea
    這兩個目錄下放置的都是Android Studio自動生成的一些文件,我們無須關心,也不要去手動編輯.
  2. app
    項目中的代碼,資源等內容幾乎都是放置在這個目錄下的,我們后面的開發工作也基本都是在這個目錄下進行的,待會兒還會對這個目錄單獨展開進行講解.
  3. build
    它主要包含了一些編譯時自動生成的文件
  4. gradle
    這個目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle下載好,而是會自動根據本地的緩存情況決定是否需要聯網下載gradle.Android Studio默認沒有啟用gradle wrapper的方式,如果需要打開,可以點擊Android Studio導航欄-->File-->Settings-->Build,Execution,Deployment-->Gradle,進行配置更改.
  5. .gitignore
    這個文件是用來將指定的文件排除在版本控制之外的.
  6. build.gradle
    這是項目全局的gradle構建腳本,通常這個文件中的內容是不需要修改的.
  7. gradle.properties
    這個文件是全局的gradle配置文件, 在這里配置的屬性將會影響到項目中所有的gradle編譯腳本.
    8, gradlew和gradlew.bat
    這兩個文件是用來命令行界面中執行gradle命令的,其中gradlew是在Linux或Mac系統中使用的,gradlew.bat是在Windows中使用的.
  8. HelloWorld.iml
    img文件是所有IntelliJ IDEA項目都會自動生成的一個文件(Android Studio是基于IntelliJ IDEA開發的),用于標識這是一個IntelliJ IDEA項目,我們不需要修改這個文件中的任何內容.
  9. local.properties
    這個文件用于指定Android SDK路徑,通常內容都是自動生成的,我們并不需要修改,除非你本機中的Android SDK位置發生了變化 ,那么就將這個文件中的路徑改成新的位置即可.
  10. settings.gradle
    這個文件用于指定項目中所有引入的模塊,由于HelloWorld項目中就只有一個app模塊,因此這個文件中也就只引入了一個模塊,通常情況下模塊的引入都是自動完成的,需要我們手動去修改這個文件的場景可能表較少

app目錄, 如圖:


app目錄下的結構

那么下面我們就來對app目錄下的內容進行更為詳細的分析

  1. build
    這個目錄和 外層的build目錄類似,主要也是包含了一些在編譯時自動生成的文件,不過它里面的內容更多更雜,我們不需要過多關心
  2. libs
    如果你的項目中使用到了第三方jar包,就需要把這些jar包都放在libs目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑里去
  3. androidTest
    此處是用來編寫Android Test測試用例的.可以對項目進行一些自動化測試
  4. java
    毫無疑問,java目錄是放置我們所有Java代碼的地方,展開該目錄,你將看到我們剛才創建的HelloWorldActivity文件就在里面
  5. res
    項目中使用到的所有圖片,布局,字符串等資源都要存放在這個目錄下.當然這個目錄下還有很多子目錄,圖片放在drawable目錄下,布局放在layout目錄下,字符串放在values目錄下,所以你不用擔心會把整個res目錄弄得亂糟糟的.
    6, Androidmanifest.xml
    這是你整個Android項目的配置文件,你在程序中定義的四大組件都需要在這個文件里注冊,另外還可以在這個文件中給應用添加權限聲明,由于這個文件以后會進場用到,我們用到的時候再做詳細說明.
  6. test
    此處是用來編寫Unit Test測試用例的. 是對項目進行自動化測試的另一種方式.
  7. .gitigmore
    這個文件用于將app模塊內的指定的目錄或文件排除在版本控制之外,作用和外層的.gitignore文件類似
  8. app.iml
    IntelliJ IDEA項目自動生成的文件, 我們不需要關心或修改這個文件中的內容
  9. build.gradle
    這是app模塊的gradle構建腳本,這個文件中會指定很多項目構建相關的配置,我們稍后將會詳細分析gradle構建腳本中的具體內容
  10. proguard-rules.pro
    這個文件用于指定項目代碼的混淆規則,當代碼開發完成后打成安裝包文件,如果不希望代碼被別人破解,通常會將代碼進行混淆,從而讓破解者難以閱讀.
1.3.5 詳解項目中的資源
res目錄下的結構
  1. 所有以drawable開頭的文件夾都是用來放圖片的,所有以mipmap開頭的文件夾都是用來放應用圖標的,所有以values開頭的文件夾都是用來放字符串,樣式,顏色等配置的,layout文件夾是用來放布局文件的.

  2. 之所以這么多mipmap開頭的文件夾,其實主要是為了讓程序能夠更好地兼容各種設備.drawable文件夾也是同樣的道理

  3. drawable-v24和mipmap-anydpi-v26是為了適配Android8.0系統應用圖標而自動生成的

  4. 打開values/string.xml,內容如下

     <resources>
     <string name="app_name">HelloWorld</string>
     </resources>
    

可以看到, 這里定義了一個應用程序名的字符串,我們有以下兩種方式來引用它.

  • 在代碼中通過R.string.app_name可以獲得該字符串的引用.
  • 在XML中通過@string/app_name可以獲得該字符串的引用.
  1. 打開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文件
  1. 先來看下外層目錄下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'這個插件,其中,最后面的部分是版本號.
  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第一行代碼第一章的全部內容,書中寫的比較細致,很全面,同時收貨也很多.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380