一、系統(tǒng)適配相關(guān)的幾個(gè)重要概念
手機(jī)的系統(tǒng)版本:
指的是手機(jī)的Android系統(tǒng)版本丽惭,例如Android8.0
應(yīng)用的的設(shè)置版本:
1击奶、minSdkVersion
是指支持到手機(jī)系統(tǒng)的最低版本,如果手機(jī)系統(tǒng)的api比這個(gè)低责掏,則手機(jī)無(wú)法安裝此應(yīng)用
2柜砾、targetSdkVersion
是指該應(yīng)用運(yùn)行時(shí)的目標(biāo)系統(tǒng)環(huán)境版本,targetSdkVersion需要大于或者等于minSdkVersion换衬,實(shí)際運(yùn)行時(shí)的分兩種情況
其一:手機(jī)系統(tǒng)大于或者等于targetSdkVersion時(shí)痰驱,運(yùn)行環(huán)境及遵循的api限制為targetSdkVersion的版本
其二:手機(jī)系統(tǒng)小于targetSdkVersion時(shí),運(yùn)行環(huán)境及遵循的api限制為手機(jī)系統(tǒng)的版本
舉兩個(gè)targetSdkVersion的例子
1.Android系統(tǒng)為8.0瞳浦,應(yīng)用的targetSdkVersion為23(即Android系統(tǒng)6.0担映,不明白請(qǐng)參考下文的對(duì)照表),那么該應(yīng)用不需要理會(huì)8.0要求的多渠道通知及一定要使用前臺(tái)服務(wù)的限制叫潦,只需滿足6.0的系統(tǒng)限制蝇完,即運(yùn)行時(shí)的效果跟在6.0系統(tǒng)中的表現(xiàn)是一致的
2.Android系統(tǒng)為5.0,應(yīng)用的targetSdkVersion為23(即Android系統(tǒng)6.0)矗蕊,那么該應(yīng)用運(yùn)行時(shí)的效果只會(huì)表現(xiàn)出5.0系統(tǒng)的特性(例如限制和一些api的使用等)短蜕,并不會(huì)表現(xiàn)出任何Android系統(tǒng)6.0的特性
*注意:compileSdkVersion是AS編譯APK使用的API Level,CompileSDKVersion不會(huì)改變apk運(yùn)行時(shí)的行為拔妥,也不會(huì)被包含到apk中忿危,只是編譯的時(shí)候起提示的作用,一般來(lái)說(shuō)compileSdkVersion需要大于等于targetSdkVersion
二没龙、系統(tǒng)名稱(chēng)铺厨,版本號(hào)缎玫,api等級(jí)對(duì)照表
Android 4.4(KitKat)? ????????? Build.VERSION_CODES.K? ? ? ????????????????????api19
android 5.0 (Lollipop)?????????????Build.VERSION_CODES.LOLLIPOP???????????api21
android 5.1(Lollipop)? ? ? ? ? ? ? ?Build.VERSION_CODES.LOLLIPOP_MR1??????????api22
android 6.0 (Marshmallow)? ? ? Build.VERSION_CODES.M????????????api23
android 7.0? ?(Nougat)? ? ? ? ? ? ? Build.VERSION_CODES.N? ????????????api24
android 7.1? ?(Nougat)??????????????Build.VERSION_CODES.N_MR1 ? api25
android 8.0(Oreo)????????????????Build.VERSION_CODES.O ? ????????????api26
android 8.1(Oreo)? ? ? ? ? ? ? ? Build.VERSION_CODES.O_MR1? ?????api27????
android 9.0? (Pie)? ? ? ? ? ? ? ? ? ? ??Build.VERSION_CODES.P? ? ????????????????api28
android 10.0
android 11.0
*這里只是列出最常見(jiàn)的,還有一些在很低存在感的版本請(qǐng)查看官網(wǎng)
https://developer.android.google.cn/about/versions/11
三解滓、如何處理不同系統(tǒng)平臺(tái)的代碼
1赃磨、@RequiresApi?
官方的解釋是Denotes that the annotated element should only be called on the given API level or higher
使用場(chǎng)景:當(dāng)你使用一個(gè)較高版本才有的api(比工程中的minSdkVersion高)時(shí),編譯器會(huì)報(bào)錯(cuò)洼裤,@RequiresApi可以讓代碼編譯通過(guò)
例如
@RequiresApi(api = Build.VERSION_CODES.M)
public void doSomething(){
? ? //一些只能在個(gè)別版本sdk才擁有的方法
}
即:使用此注解的代碼邻辉,只會(huì)在當(dāng)前版本等于或者大于當(dāng)前的Build.VERSION_CODES.M(即api23)時(shí),才運(yùn)行doSomething()方法
2腮鞍、@TargetApi
同@RequiresApi 值骇,但是屬于過(guò)時(shí)的方法,建議使用@RequiresApi 來(lái)替代
3移国、可以通過(guò)判斷sdk的版本(Build.VERSION.SDK_INT)吱瘩,來(lái)為能夠使用的版本進(jìn)行個(gè)性化設(shè)置
例如:沉浸式狀態(tài)欄配適
在Android系統(tǒng)4.4以前,狀態(tài)欄的背景色和字體顏色都是不能改變的迹缀。但是4.4以后Google增加了改變狀態(tài)欄背景透明的方法使碾。可以通過(guò)判斷sdk的版本祝懂,來(lái)為能夠使用的版本進(jìn)行個(gè)性化設(shè)置:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}
沉浸式狀態(tài)欄是Android在5.0中引入的票摇,在5.0之前是沒(méi)有的,并且在Android6.0中沉浸式狀態(tài)欄的使用方法和5.0不一樣砚蓬,因此需要做到版本兼容矢门,針對(duì)于不同的Android進(jìn)行適配,同樣也是通過(guò)判斷Build.VERSION.SDK_INT來(lái)區(qū)分版本怜械,進(jìn)行個(gè)性化配適
Android4.4
android4.4又稱(chēng)Android K(Kitkat)
1.webview的變化
4.4版本以后對(duì)http與https進(jìn)行了安全認(rèn)證的區(qū)分颅和,4.4以后默認(rèn)不支持https這種方式,但是提供了三種向下兼容的模式:
MIXED_CONTENT_NEVER_ALLOW:Webview不允許一個(gè)安全的站點(diǎn)(https)去加載非安全的站點(diǎn)內(nèi)容(http),比如缕允,https網(wǎng)頁(yè)內(nèi)容的圖片是http鏈接峡扩。強(qiáng)烈建議App使用這種模式,因?yàn)檫@樣更安全
MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下障本,WebView是可以在一個(gè)安全的站點(diǎn)(Https)里加載非安全的站點(diǎn)內(nèi)容(Http),這是WebView最不安全的操作模式教届,盡可能地不要使用這種模式
MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當(dāng)涉及到混合式內(nèi)容時(shí)驾霜,WebView會(huì)嘗試去兼容最新Web瀏覽器的風(fēng)格案训。一些不安全的內(nèi)容(Http)能被加載到一個(gè)安全的站點(diǎn)上(Https),而其他類(lèi)型的內(nèi)容將會(huì)被阻塞粪糙。這些內(nèi)容的類(lèi)型是被允許加載還是被阻塞可能會(huì)隨著版本的不同而改變强霎,并沒(méi)有明確的定義。這種模式主要用于在App里面不能控制內(nèi)容的渲染蓉冈,但是又希望在一個(gè)安全的環(huán)境下運(yùn)行城舞。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
? ? settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}?
4.4以后webview默認(rèn)不保存cookie狀態(tài)
如果要設(shè)置在4.4以后進(jìn)行cookie保存轩触,可以這樣設(shè)置
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
? ? //android5.0以后webview默認(rèn)不在保存cookie所以會(huì)導(dǎo)致第三方登錄狀態(tài)無(wú)法保存
? ? CookieManager cookieManager = CookieManager.getInstance();
? ? cookieManager.setAcceptThirdPartyCookies(webView,true);
}
Android5.0
android5.0又稱(chēng)Android L(Lollipop)
1.安裝時(shí)控制權(quán)限
用戶(hù)可以在安裝時(shí)關(guān)閉某些靜態(tài)注冊(cè)的權(quán)限。
2.用戶(hù)體驗(yàn)優(yōu)化
引入Material Design設(shè)計(jì)家夺,開(kāi)始采用扁平化設(shè)計(jì)脱柱,會(huì)擁有類(lèi)似物理表面和邊緣的視覺(jué)效果,動(dòng)態(tài)陰影和動(dòng)畫(huà)方面的加強(qiáng)拉馋。
3.增加供開(kāi)發(fā)者使用的官方控件
引入抽屜布局(DrawerLayout)榨为、RecyclerView、CardView煌茴、SwipeRefreshLayout随闺、ToolBar、drawerToggle等景馁,開(kāi)始能夠自定義狀態(tài)欄板壮、標(biāo)題欄逗鸣、導(dǎo)航欄的顏色合住,設(shè)置控件陰影。
4.增加觸摸反饋
當(dāng)用戶(hù)與用戶(hù)界面進(jìn)行交互時(shí)撒璧,觸摸反饋在觸摸點(diǎn)上提供了一種瞬時(shí)視覺(jué)確認(rèn)透葛,按鈕的默認(rèn)觸摸反饋動(dòng)畫(huà)使用新的RippleDrawable類(lèi)。
5.增加activity的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
Android6.0
Android6.0又稱(chēng)Android M(Marshmallow)
1.完整的權(quán)限控制
危險(xiǎn)的權(quán)限都需要向系統(tǒng)動(dòng)態(tài)申請(qǐng)卿樱,只靜態(tài)注冊(cè)申請(qǐng)權(quán)限會(huì)無(wú)效化僚害。對(duì)于一些隱私權(quán)限會(huì)在第一時(shí)間提示用戶(hù)是否授權(quán)。
新增API
ContextCompact.checkSelfPermission() 檢測(cè)是否擁有權(quán)限
ActivityCompact.requestPermission() 申請(qǐng)授權(quán)
onRequestPermissionsResult() 用戶(hù)是否授權(quán)
ActivityCompat.shouldShowRequestPermissionRationale() 權(quán)限解釋?zhuān)ㄓ脩?hù)拒絕后出現(xiàn))
Android7.0
android7.0又稱(chēng)android N(Nougat)
1.后臺(tái)優(yōu)化
刪除了三項(xiàng)隱式廣播(CONNECTIVITY_ACTION繁调、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO)萨蚕,優(yōu)化內(nèi)存使用和電量消耗。
Android8.0
Android8.0又稱(chēng)Android O(oreo)
1.PinnedShortcuts功能
類(lèi)似蘋(píng)果的3DTouch蹄胰,長(zhǎng)按一個(gè)軟件后可以彈出子菜單岳遥,然后就可以通過(guò)這個(gè)方式快捷的使用該應(yīng)用的部分功能。
2.自適應(yīng)圖標(biāo)支持多種形狀
能在不同的設(shè)備型號(hào)上顯示不同的圖標(biāo)形狀裕寨。比如同一個(gè)桌面圖標(biāo)在一家 OEM 廠商的設(shè)備上顯示為圓形浩蓉,在另一家則可以顯示為方形。通過(guò)定義兩張圖層(前景與背景)你可以制定你的桌面圖標(biāo)外觀宾袜,你必須提供沒(méi)有形狀捻艳、陰影的 PNG 格式圖象作為圖層 Drawable。
3.通知渠道 — Notification Channels
通知渠道是由應(yīng)用自行定義的通知內(nèi)容類(lèi)別庆猫,借助渠道认轨,開(kāi)發(fā)者可以讓用戶(hù)對(duì)不同種類(lèi)的通知進(jìn)行精細(xì)控制。
4.后臺(tái)限制
對(duì)隱式廣播月培、后臺(tái)服務(wù)和位置更新等進(jìn)行了后臺(tái)自動(dòng)限制
Android9.0
Android9.0又稱(chēng)Android P(pie)
1.對(duì)全面屏的支持
模仿了ios提高屏占比的方案(前攝像頭沒(méi)有比較好的隱藏方案)嘁字,即支持齊劉海昨稼。借助最新的提供的DisplayCutout類(lèi),開(kāi)發(fā)者可以找到非功能區(qū)域的位置和形狀拳锚,而非功能區(qū)域是不應(yīng)顯示功能的假栓;使用getDisplayCutout()就可以獲取這個(gè)區(qū)域的詳細(xì)信息。
2.通知欄(狀態(tài)欄)
現(xiàn)在只允許顯示最多4個(gè)通知圖標(biāo)霍掺,不管當(dāng)前設(shè)備是否是齊劉海匾荆,多出來(lái)的通知顯示為三個(gè)點(diǎn)。Android P版本中杆烁,你還可以在消息中展示圖像牙丽;新的Notification.Person類(lèi)可以識(shí)別對(duì)話中的任務(wù),包括他們的頭像和URI兔魂。
3.多攝像頭畫(huà)面
可以即時(shí)獲取到兩個(gè)或者更多的相機(jī)數(shù)據(jù)流烤芦。
4.神經(jīng)網(wǎng)絡(luò)
任務(wù)可以聲明它們估算的數(shù)據(jù)大小,信號(hào)預(yù)讀取并且指定詳細(xì)的網(wǎng)絡(luò)需求析校。即根據(jù)任務(wù)需求的數(shù)據(jù)大小和當(dāng)前的網(wǎng)絡(luò)環(huán)境构罗,在收費(fèi)網(wǎng)絡(luò)里延遲一些網(wǎng)絡(luò)要求,而在不計(jì)費(fèi)的網(wǎng)絡(luò)里可以通過(guò)消息預(yù)獲取來(lái)得到更好的用戶(hù)體驗(yàn)智玻。
5.Material Design迎來(lái)2.0時(shí)代
加入了大量的圓角設(shè)計(jì)遂唧,UI方面的優(yōu)化。
6.Android Dashboard
用戶(hù)可以看清楚自己在受手機(jī)上都干了哪些事情吊奢,從而提醒自己是否過(guò)多的浪費(fèi)了不必要的時(shí)間盖彭,并在必要的時(shí)候提醒你應(yīng)當(dāng)休息一下。對(duì)某一款應(yīng)用進(jìn)行時(shí)間限制页滚,用戶(hù)使用到一定時(shí)間之后就會(huì)提醒召边,甚至讓圖標(biāo)變灰色,以提醒用戶(hù)盡量少用這個(gè)APP裹驰。
7.Wind Down模式
全局的夜間模式(個(gè)人感覺(jué)這個(gè)好人性化)
8.Adaptive Battery模式
一個(gè)電池優(yōu)化模式隧熙,提高續(xù)航。在該模式下邦马,程序不需要喚醒可以極大的降低資源占用贱鼻,更關(guān)注用戶(hù)最常用的服務(wù)和應(yīng)用程序。
9.Shush模式
在這個(gè)模式下滋将,如果用戶(hù)將手機(jī)屏幕朝下放置邻悬,那么手機(jī)會(huì)自動(dòng)調(diào)整為震動(dòng)或者靜音模式,只保留鬧鐘的聲音随闽。
10.檢測(cè)用戶(hù)的行為父丰,讓系統(tǒng)作出對(duì)應(yīng)的動(dòng)作
如插入耳機(jī)孔自動(dòng)播放音樂(lè),搜索“打車(chē)”自動(dòng)顯示打車(chē)軟件等。
總結(jié):主打?qū)Υ笃聊缓鸵曈X(jué)體驗(yàn)的優(yōu)化蛾扇,對(duì)電池電量的優(yōu)化攘烛,開(kāi)始智能化,會(huì)對(duì)用戶(hù)行為的學(xué)習(xí)及正確化引導(dǎo)镀首,網(wǎng)絡(luò)環(huán)境的智能適應(yīng)坟漱,更加人性化。