自學(xué)郭霖《第一行代碼》第二版一個(gè)月,發(fā)現(xiàn)這確實(shí)一本非常適合小白的書(shū),從安裝Android Studio到創(chuàng)建第一個(gè)活動(dòng)最后寫下第一行Android代碼,上面寫的都非常清楚。以為這樣按著書(shū)本內(nèi)容學(xué)下去,不求能變成什么大神(不現(xiàn)實(shí)),最起碼能在Android項(xiàng)目上有一定自學(xué)能力,遇到問(wèn)題能找到方法去解決,能看懂別人寫的代碼,這是我夢(mèng)寐以求想得到的能力。剛起步這個(gè)開(kāi)始是賊痛苦也是很迷茫的,也不知道這個(gè)過(guò)程什么時(shí)候能夠結(jié)束,而我自己能做得就是把握好當(dāng)下每一天,自己天天有進(jìn)步就好。還有最重要的一點(diǎn):每天提醒自己不能懶惰,不能放縱自己。
《第一行代碼》這本書(shū)我了頭三章,現(xiàn)在在看第四章碎片的部分。本以為這樣按部就班能把整部書(shū)這樣循環(huán)漸進(jìn)地學(xué)習(xí)下去,但是我人生第一個(gè)Android項(xiàng)目來(lái)臨了。這是一個(gè)關(guān)于打印機(jī)的項(xiàng)目,就是掃碼支付然后打印出小票,看似我們生活息息相關(guān)的一幕,卻難倒了我。哪能怎辦,硬著頭皮上唄,我同事告訴我技術(shù)就是讓逼出來(lái)的。不會(huì)的東西只能自己去查,出現(xiàn)錯(cuò)誤自己研究。沒(méi)人能幫你只能靠你自己。所以今天開(kāi)始結(jié)合項(xiàng)目地去學(xué)習(xí)。首先我拿到需求看了一下,需求1:基于安卓4.2.2系統(tǒng)做應(yīng)用開(kāi)發(fā)。看到這個(gè)需求我隱約記得書(shū)上第一章講到過(guò),于是趕緊去翻書(shū),找到了app目錄下的build.gradle文件對(duì)android閉包所有內(nèi)容又重新看了一遍,剛開(kāi)始以為是要改這個(gè)地方
后來(lái)發(fā)現(xiàn)這里的 25表明用Android7.1系統(tǒng)的SDK編譯。然后去一個(gè)Android交流群?jiǎn)柫艘幌拢?/p>
人告訴我有兩個(gè)問(wèn)題:第一,你只是在4.2.2系統(tǒng)上運(yùn)行(實(shí)際項(xiàng)目根本不會(huì)這么做)。第二還是最低兼容4.2.2版本以上版本都好使。我看到這個(gè)問(wèn)題第一想到的是在創(chuàng)建項(xiàng)目的時(shí)候會(huì)有一個(gè)選項(xiàng),讓你選擇最低兼容版本。當(dāng)然你也可以事后改,所要改的地方是在:
minSdkVersion用于指定項(xiàng)目最低兼容的Android系統(tǒng)版本,這里指定成15表示最低兼容到Android4.0(他們告訴我現(xiàn)在最低兼容4.4)。targetSdkVersion指定的值表示你在該目標(biāo)版本上已經(jīng)做過(guò)了出充分的測(cè)試,系統(tǒng)將會(huì)為你的應(yīng)用程序啟用一些最新的功能和特征。比如說(shuō)Android6.0系統(tǒng)中引入運(yùn)行時(shí)權(quán)限這個(gè)功能,而如果你將targetSdkVersion指定成23或者更高,那么系統(tǒng)就會(huì)為你的程序啟用運(yùn)行時(shí)權(quán)限功能,而如果你將targetSdkVersion指定成22,那么就說(shuō)明你的程序最高只在Android 5.1系統(tǒng)上做過(guò)充分的測(cè)試,Android6.0系統(tǒng)中引入的新功能自然就不會(huì)啟動(dòng)了。這時(shí)候我就想問(wèn)了這里的15、25是代表什么意思?其實(shí)這里的15、25代表的是API等級(jí)。那么API等級(jí)又是什么?API級(jí)別是一個(gè)整數(shù)值,它唯一標(biāo)識(shí)了一個(gè)具體版本的Android平臺(tái),及其框架的API的版本。
Android平臺(tái)提供了一套框架API,使得應(yīng)用程序可以與系統(tǒng)底層進(jìn)行交互。該框架API由以下模塊組成:
一組核心的包和類
清單(manifest)文件的XML元素和屬性聲明
資源文件的XML元素和屬性聲明及訪問(wèn)形式
各類意圖(Intents)
應(yīng)用程序可以請(qǐng)求的各類授權(quán),以及系統(tǒng)中包含的授權(quán)執(zhí)行
每個(gè)Android平臺(tái)的后續(xù)版本會(huì)包括它提供的更新的Andr??oid應(yīng)用程序框架的API。
該框架的API的更新設(shè)計(jì),使高版本的API與早期版本兼容。也就是說(shuō),在新版本API中大多數(shù)都是新增功能,和引進(jìn)新的或替代的功能。作為API的部分升級(jí),老的替換的部分已過(guò)時(shí),但不會(huì)從新版本中刪除,使得已有的應(yīng)用程序仍然可以使用它們。在極少數(shù)情況下,舊版本API的部分可能被修改或刪除,通常這種變化是為了保障API的穩(wěn)定性及應(yīng)用程序或系統(tǒng)的安全。所有其他早期版??本的API將不做修改的保留。
一個(gè)Android平臺(tái)提供的框架API,被指定一個(gè)整數(shù)標(biāo)識(shí)符,稱為“API級(jí)別”。每一個(gè)版本的Android平臺(tái)只支持有一個(gè)API級(jí)別,雖然該支持是隱含地包括了所有早期的API級(jí)別(一直到API級(jí)別1級(jí))。Andr??oid平臺(tái)的最初版本提供的框架API級(jí)別是1級(jí),隨后的版本依次遞增。
應(yīng)運(yùn)API 等級(jí)的意義:
API級(jí)別標(biāo)識(shí)為保證用戶和應(yīng)用程序開(kāi)發(fā)者的最佳體驗(yàn),起了關(guān)鍵作用:
它讓Android平臺(tái)可以描述它支持的框架API的最高版本
它讓應(yīng)用程序可以描述它需要的框架API版本
它使得系統(tǒng)可以在硬件設(shè)備上安裝應(yīng)用程序時(shí)能夠檢查版本是否匹配,使得版本不兼容的應(yīng)用程序不會(huì)被錯(cuò)誤安裝在設(shè)備之上.
每個(gè)版本的Android平臺(tái)都在其內(nèi)部存儲(chǔ)了自己的API級(jí)別標(biāo)識(shí)。
應(yīng)用程序可以用框架API提供的清單文件元素—來(lái)描述該應(yīng)用程序可以運(yùn)行的最小和最大API級(jí)別,以及應(yīng)用程序開(kāi)發(fā)者設(shè)計(jì)期望運(yùn)行的平臺(tái)版本。三種屬性分別描述如下:
android:minSdkVersion—指明該應(yīng)用程序可以運(yùn)行的API最低版本。默認(rèn)是“1”。
android:targetSdkVersion—指明該應(yīng)用程序設(shè)計(jì)時(shí)期望運(yùn)行的目標(biāo)API版本。在某些情況下,這允許應(yīng)用程序使用目標(biāo)API級(jí)別下定義的清單元素或行為,而不是只限于使用最低API級(jí)別定義的內(nèi)容。(譯者注:android之targetsdkversion的理解---兼容性問(wèn)題)
android:maxSdkVersion—指明該應(yīng)用程序可以運(yùn)行的最高API級(jí)別。重要聲明:使用該屬性之前請(qǐng)閱讀文檔。
比如,要指明一個(gè)應(yīng)用程序能夠運(yùn)行的最低API級(jí)別,應(yīng)當(dāng)在該應(yīng)用程序的清單文件的元素中加入android:minSdkVersion屬性。android:minSdkVersion的值是一個(gè)正整數(shù),對(duì)應(yīng)的是該應(yīng)用程序能夠運(yùn)行的最低平臺(tái)的API級(jí)別標(biāo)識(shí)。
用戶嘗試安裝一個(gè)應(yīng)用程序,或者在系統(tǒng)升級(jí)后重驗(yàn)證應(yīng)用程序的時(shí)候,Android系統(tǒng)首先會(huì)檢查應(yīng)用程序的清單文件中的屬性,將其與系統(tǒng)內(nèi)部API級(jí)別對(duì)比。系統(tǒng)只有在滿足下列情況時(shí)才允許進(jìn)行應(yīng)用程序安裝:
如果聲明了android:minSdkVersion屬性,其屬性值必須小于或等于該系統(tǒng)的API級(jí)別對(duì)應(yīng)的整數(shù)值。如果未聲明,系統(tǒng)會(huì)默認(rèn)該應(yīng)用程序運(yùn)行需要的最低API級(jí)別是1。
如果聲明了android:maxSdkVersion屬性,其屬性值必須等于或大于該系統(tǒng)的API級(jí)對(duì)應(yīng)的整數(shù)值。如果未聲明,系統(tǒng)會(huì)默認(rèn)該應(yīng)用程序沒(méi)有最高API級(jí)別限制。請(qǐng)通過(guò)閱讀文檔以獲得系統(tǒng)如何處理該屬性的更多信息。
應(yīng)用程序清單文件中聲明該屬性后,元素看起來(lái)應(yīng)類似于下面的例子:
這樣做的主要原因是,應(yīng)用程序會(huì)通過(guò)android:miniSdkVersion聲明的API級(jí)別來(lái)告知系統(tǒng)——該應(yīng)用程序使用的API是指定引入的API級(jí)別。假如沒(méi)有這種屬性聲明,一個(gè)應(yīng)用程序如果因?yàn)槟承┎恢脑虮话惭b在低級(jí)別API系統(tǒng)之上,那么該應(yīng)用程序會(huì)在運(yùn)行時(shí)因?yàn)閲L試訪問(wèn)不存在的API而崩潰。為此,Android系統(tǒng)通過(guò)不允許應(yīng)用程序被安裝在不滿足其最低API級(jí)別要求的目標(biāo)硬件上來(lái)防止此類結(jié)果發(fā)生。
例如,android.appwidget類包是在API級(jí)別3中開(kāi)始引入的。如果一個(gè)應(yīng)用程序使用了這個(gè)API,就必須通過(guò)指明android:minSdkVersion屬性為3來(lái)聲明運(yùn)行的最低要求。于是,該應(yīng)用程序就可以在Android 1.5(API級(jí)別3級(jí))、Android 1.6 (API級(jí)別4級(jí))等平臺(tái)上安裝,但是在Android 1.1 (API級(jí)別2級(jí))和Android 1.0平臺(tái)(API級(jí)別1級(jí))上卻是無(wú)法安裝的。如下是平臺(tái)版本和API等級(jí)對(duì)應(yīng)關(guān)系表:
Android 7.1? ? ? ? ? ??25
Android 7.0? ? ? ? ? ?24
Android 6.0? ? ? ? ? ?23
Android 5.1? ? ? ? ? ??22
Android 5.0? ? ? ? ? ??21
Android 4.4W ? ? ? ? 20? ? ? ? ? ? ??僅限 KitKat for Wearables
Android 4.4? ? ? ? ? ??19
Android 4.3? ? ? ? ? ? 18
Android 4.2、4.2.2? ? ?17? ??
Android 4.1、4.1.1? ? ??16
Android 4.0、4.0.1、4.0.2? ? ?14
Android 3.2? ? ? ? ? ? ? ?13
Android 3.1.x? ? ? ? ? ? 12
Android 3.0.x? ? ? ? ? ??11
Android 2.3.4? ? ? ? ? ? 10
Android 2.3.3 ? ? ? ? ? ?10
Android 2.3.2? ? ? ? ? ? 9
Android 2.3.1? ? ? ? ? ? 9
Android 2.3 ? ? ? ? ? ? ??9
Android 2.2.x? ? ? ? ? ??8
Android 2.1.x? ? ? ? ? ??7
Android 2.0.1? ? ? ? ? ?6
Android 2.0? ? ? ? ? ? ? ?5
Android 1.6? ? ? ? ? ? ? ??4
Android 1.5? ? ? ? ? ? ? ?3
Android 1.1? ? ? ? ? ? ? ?2
Android 1.0 ? ? ? ? ? ? ? ?1