1 : ?安卓6.0適配
權(quán)限適配:
動(dòng)態(tài)權(quán)限適配是 Android 6.0 最先開(kāi)始的昌跌,也是 Android 系統(tǒng)對(duì)開(kāi)發(fā)者影響最大的改動(dòng)之一, 只有屬于危險(xiǎn)權(quán)限的才需要申請(qǐng)動(dòng)態(tài)權(quán)限瘪松。
Android6.0之前,權(quán)限只需要在清單文件中遵守約定在 Android 6.0 ~ Android 8.0沃缘,危險(xiǎn)權(quán)限不需要?jiǎng)討B(tài)申請(qǐng)吓著。如果應(yīng)用在運(yùn)行時(shí)請(qǐng)求權(quán)限并且被授予該權(quán)限蒙谓,系統(tǒng)會(huì)錯(cuò)誤地將屬于同一權(quán)限組并且在清單中注冊(cè)的其他權(quán)限也一起授予應(yīng)用造烁,即對(duì)于同一組內(nèi)的權(quán)限搞动,只要有一個(gè)被同意灰羽,其他的都會(huì)被同意驮履。在 Android 8.0 之后,此行為已被糾正廉嚼。系統(tǒng)只會(huì)授予應(yīng)用明確請(qǐng)求的權(quán)限玫镐。然而一旦用戶(hù)為應(yīng)用授予某個(gè)權(quán)限,則所有后續(xù)對(duì)該權(quán)限組中權(quán)限的請(qǐng)求都將被自動(dòng)批準(zhǔn)怠噪,但是若沒(méi)有請(qǐng)求相應(yīng)的權(quán)限而進(jìn)行操作的話就會(huì)出現(xiàn)應(yīng)用 crash 的情況恐似。
低耗電模式:
當(dāng)手機(jī)沒(méi)有連接電源,屏幕關(guān)閉,并且靜置一段時(shí)間不晃動(dòng),就可以進(jìn)入低耗電模式.這時(shí)系統(tǒng)會(huì)定期退出低電量模式一會(huì),再退出一段時(shí)間把那些延遲的工作同步執(zhí)行,同時(shí)允許app訪問(wèn)網(wǎng)絡(luò).
app待機(jī)模式:
指app不在前臺(tái)進(jìn)程的情況下,如果用戶(hù)一段時(shí)間沒(méi)有使用該app,則該app進(jìn)入待機(jī)模式,系統(tǒng)會(huì)禁止該app訪問(wèn)網(wǎng)絡(luò),暫停同步和jobs,也不是絕對(duì)禁止,系統(tǒng)允許每個(gè)app每天大約一次的頻率訪問(wèn)網(wǎng)絡(luò).
app待機(jī)模式和低耗電模式的區(qū)別:
低耗電模式必須關(guān)閉屏幕處于靜止,沒(méi)有連接充電器,針對(duì)所有app;
app待機(jī)模式針對(duì)的是某一個(gè)應(yīng)用,不需要關(guān)閉屏幕,不需要手機(jī)保持靜止,只要某一個(gè)app是非前臺(tái)線程,一般用戶(hù)一段時(shí)間未使用該app,那么該app就會(huì)進(jìn)入待機(jī)模式,即使此刻用戶(hù)在使用其他app;
2:安卓7.0
APK signature scheme v2
Android 7.0 引入一項(xiàng)新的應(yīng)用簽名方案?:APK Signature Scheme v2,它能提供更快的應(yīng)用安裝時(shí)間和更多針對(duì)未授權(quán) APK 文件更改的保護(hù)矫夷。在默認(rèn)情況下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 會(huì)使用 APK Signature Scheme v2 和傳統(tǒng)簽名方案來(lái)簽署您的應(yīng)用。
1.只勾選V1簽名就是傳統(tǒng)方案簽署阳仔,但是在 Android 7.0 上不會(huì)使用V2安全的驗(yàn)證方式忧陪。
?2.只勾選V2簽名7.0以下會(huì)顯示未安裝,Android 7.0 上則會(huì)使用了V2安全的驗(yàn)證方式近范。
?3.同時(shí)勾選V1和V2則所有版本都沒(méi)問(wèn)題赤嚼。
org.apache不支持問(wèn)題
// build.gradle里面加上這句話
?defaultConfig {
useLibrary 'org.apache.http.legacy'
?}
SharedPreferences閃退
Android7.0前,我們對(duì)于app的私有文件,比如sp,我們可以設(shè)置權(quán)限(MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE)來(lái)讓其他應(yīng)用訪問(wèn),Android 7.0以后不能使用這個(gè)獲取,會(huì)閃退// 應(yīng)修改成MODE_PRIVATE
?SharedPreferences read = getSharedPreferences(RELEASE_POOL_DATA, MODE_WORLD_READABLE);?
進(jìn)一步增強(qiáng)低耗電模式:
Android7.0系統(tǒng)的改變主要針對(duì)于延長(zhǎng)電池的使用壽命以及減少內(nèi)存的使用,6.0需要手機(jī)處于未充電,屏幕關(guān)閉,手機(jī)處于靜止;7.0不需要手機(jī)處于靜止(例如用戶(hù)外出時(shí)把設(shè)備放在口袋里),系統(tǒng)會(huì)讓部分CPU和網(wǎng)絡(luò)受到限制,進(jìn)一步增強(qiáng)了低電耗模式.
后臺(tái)優(yōu)化:
用過(guò)蘋(píng)果手機(jī)的老鐵們想必都知道,蘋(píng)果手機(jī)是很難出現(xiàn)卡頓現(xiàn)象的,而安卓手機(jī)卡頓的較為嚴(yán)重,主要是因?yàn)樘O(píng)果系統(tǒng)里,app想在后臺(tái)一直運(yùn)行是很難的,未經(jīng)允許的app在后臺(tái)最多存活不到幾分鐘,而安卓應(yīng)用后臺(tái)悄悄啟動(dòng)的機(jī)會(huì)太多了,比如清單文件里注冊(cè)了某app的靜態(tài)廣播,靜態(tài)廣播是不受進(jìn)程影響的,比如監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)改變的廣播,監(jiān)聽(tīng)手機(jī)拍照或錄像的廣播,即使應(yīng)用被關(guān)閉了,一旦廣播發(fā)出,注冊(cè)了廣播的應(yīng)用也直接被喚醒,造成殺不死的現(xiàn)象,而7.0針對(duì)這一現(xiàn)象,限制了這三種廣播在清單文件的靜態(tài)注冊(cè),只能動(dòng)態(tài)注冊(cè).
文件共享:
app之間的私有文件共享只能用FileProvider這種方式.FileProvider是通過(guò)一種臨時(shí)授權(quán)的方式讓其他app來(lái)訪問(wèn)我自己app私有文件夾的方式,訪問(wèn)過(guò)一次就失效了,下次想訪問(wèn)就失效了除非再次授權(quán).
Android 8.0適配
Android 8.0中PHONE權(quán)限組新增兩個(gè)權(quán)限
ANSWER_PHONE_CALLS:允許您的應(yīng)用通過(guò)編程方式接聽(tīng)呼入電話顺又。要在您的應(yīng)用中處理呼入電話更卒,您可以使用 acceptRingingCall() 函數(shù)。 READ_PHONE_NUMBERS:權(quán)限允許您的應(yīng)用讀取設(shè)備中存儲(chǔ)的電話號(hào)碼稚照。
后臺(tái)執(zhí)行適配
8.0增加了許多特性,但是對(duì)我們開(kāi)發(fā)過(guò)程中影響比較大的主要就是后臺(tái)執(zhí)行限制,后要執(zhí)行限制分為后臺(tái)服務(wù)限制和廣播限制.
1:后臺(tái)服務(wù)限制:
首先區(qū)分一下后臺(tái)和前臺(tái): 具有可見(jiàn)Activity(不管該Activity已啟動(dòng)還是已暫停),具有前臺(tái)服務(wù),另一個(gè)前臺(tái)應(yīng)用已關(guān)聯(lián)到該應(yīng)用.這是前臺(tái).否則就是后臺(tái).
對(duì)于后臺(tái)服務(wù)的限制就是指不讓處于后臺(tái)的app任意創(chuàng)建和運(yùn)行前臺(tái)和后臺(tái)服務(wù).處于前臺(tái)時(shí),應(yīng)用可以自由創(chuàng)建和運(yùn)行前臺(tái)服務(wù)與后臺(tái)服務(wù).進(jìn)入后臺(tái)時(shí),在一個(gè)持續(xù)數(shù)分鐘的時(shí)間窗內(nèi),應(yīng)用仍可以創(chuàng)建和使用服務(wù).時(shí)間窗結(jié)束后應(yīng)用被視為處于空閑狀態(tài).此時(shí)系統(tǒng)將停止應(yīng)用的后臺(tái)服務(wù).
在Android8.0之前,創(chuàng)建前臺(tái)服務(wù)的方式通常是先創(chuàng)建一個(gè)后臺(tái)服務(wù),然后將后臺(tái)服務(wù)推向前臺(tái).Android8.0之后,系統(tǒng)不允許后臺(tái)應(yīng)用創(chuàng)建后臺(tái)服務(wù).因此引入了一個(gè)全新的方法Context.startForegroundService(),以在前臺(tái)啟動(dòng)新服務(wù).在系統(tǒng)創(chuàng)建服務(wù)后,應(yīng)用有五秒時(shí)間來(lái)調(diào)用該服務(wù)的startForegroud()方法來(lái)把后臺(tái)服務(wù)推向前臺(tái)顯示并在通知欄顯示服務(wù)可見(jiàn),如果應(yīng)用在此時(shí)間內(nèi)未調(diào)用startForegroud(),則系統(tǒng)將停止服務(wù)并聲明此應(yīng)用ANR.
2:廣播限制:
Android 8.0中把廣播分為隱式和顯示兩種,并禁止app在清單文件中注冊(cè)部分隱式廣播. 只能通過(guò)動(dòng)態(tài)方式注冊(cè). 為了更好的管制通知的提醒蹂空,不想一些不重要的通知打擾用戶(hù),新增了通知渠道果录,用戶(hù)可以根據(jù)渠道來(lái)屏蔽一些不想要的通知上枕。
Android 9.0適配
在9.0中有一些原生的劉海屏的適配,電源管理和http網(wǎng)絡(luò)請(qǐng)求的限制.
http網(wǎng)絡(luò)請(qǐng)求的限制就是如果我們的app target版本是28+,那么不管我們是原生的HttpUrlConnection還是okhttp,那么如果使用http請(qǐng)求網(wǎng)絡(luò)將會(huì)報(bào)錯(cuò).解決辦法有三種:
1:降低target版本,小于28即可
2:http換成https.
3:在res目錄下新增一個(gè)xml目錄,再在xml目錄下建立一個(gè)文件名任意的xml文件,內(nèi)容大概就是運(yùn)行開(kāi)啟http請(qǐng)求.
然后在清單文件里application標(biāo)簽增加以下屬性: