最近在做8.0以及P版本的是適配,對安卓的行為變更,對企業(yè)項目的影響做了簡單的整理
Android 8.0 行為變更主要分為兩個部分:針對所有 API 級別的應(yīng)用和針對Android 8.0 的應(yīng)用
詳情請見:https://developer.android.google.cn/about/versions/oreo/android-8.0-changes.html#atap
針對企業(yè)項目適配Android8.0可能受影響的模塊:
個別功能特別說明:
1.?Android8.0運(yùn)行時權(quán)限策略變化和適配方案
Android系統(tǒng)的運(yùn)行時權(quán)限是從Android 6.0(Android M)開始加入的,在安卓O系統(tǒng)之前,如果應(yīng)用在運(yùn)行時動態(tài)請求權(quán)限并被用戶授予了該權(quán)限,系統(tǒng)會同時將屬于同一權(quán)限組并且在Manifiest清單中注冊的其它所有權(quán)限也一起授予給應(yīng)用。
對于安卓O系統(tǒng)的應(yīng)用,此行為已經(jīng)被糾正,系統(tǒng)只會授予應(yīng)用明確請求的權(quán)限,權(quán)限授予后并不會一起把同一權(quán)限組的其它所有權(quán)限也授予給應(yīng)用。
在安卓O系統(tǒng),一旦用戶為應(yīng)用授予某個權(quán)限,則所有后續(xù)對該權(quán)限組中其它權(quán)限的權(quán)限請求都將被自動批準(zhǔn)。舉個例子,假設(shè)某個應(yīng)用在其清單(Manifiest.xml)中列有READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE兩個權(quán)限。應(yīng)用動態(tài)運(yùn)行時請求READ_EXTERNAL_STORAGE,并且用戶授予了該權(quán)限,如果該應(yīng)用針對的是API級別24或更低級別(targetVersion
<= 24),系統(tǒng)還會同時授予WRITE_EXTERNAL_STORAGE,因為該權(quán)限也屬于STORAGE權(quán)限組并且也在清單中注冊過。如果該應(yīng)用針對的是Android O(targetVersion = 25),則系統(tǒng)此時僅會授予READ_EXTERNAL_STORAGE,不過在該應(yīng)用以后動態(tài)申請WRITE_EXTERNAL_STORAGE權(quán)限時,系統(tǒng)會立即授予該權(quán)限,而不會提示用戶。
Android 8.0 引入了多個與電話有關(guān)的新權(quán)限:
ANSWER_PHONE_CALLS允許您的應(yīng)用通過編程方式接聽呼入電話。要在您的應(yīng)用中處理呼入電話,您可以使用acceptRingingCall()函數(shù)。
READ_PHONE_NUMBERS權(quán)限允許您的應(yīng)用讀取設(shè)備中存儲的電話號碼。
這些權(quán)限均被劃分為危險類別,屬于PHONE權(quán)限組。
2.?Android 8.0針對服務(wù)、廣播兩個組件的限制以及適配方案?
1.對服務(wù)的限制
前臺服務(wù)不受影響,但后臺服務(wù)會被限制。只要滿足以下任意一個都認(rèn)為是前臺App:
App有一個可見的Activiy
App有一個前臺是service
App與其他前臺App有交互,比如遠(yuǎn)程服務(wù)綁定、數(shù)據(jù)庫監(jiān)聽、使用其中一個內(nèi)容提供程序等(IME、壁紙服務(wù)、壁紙服務(wù)、壁紙服務(wù))
如果以上條件均不滿足,應(yīng)用將被視為處于后臺。前臺App的service使用可以隨心所欲,但是當(dāng)應(yīng)用退入后臺進(jìn)入idle狀態(tài)時,系統(tǒng)會停止這個應(yīng)用的service,停止方式與Service.stopSelf()方法等效。Android8.0系統(tǒng)不允許后臺應(yīng)用創(chuàng)建后臺服務(wù)。 因此,Android 8.0 引入了一種全新的方法,即Context.startForegroundService(),以在前臺啟動新服務(wù)。在用普通方法創(chuàng)建服務(wù)后,應(yīng)用有五秒的時間來調(diào)用該服務(wù)的 startForeground() 方法以顯示新服務(wù)的用戶可見通知。如果應(yīng)用在此時間限制內(nèi)未調(diào)用 startForeground(),則系統(tǒng)將停止服務(wù)并拋出ANR異常
2.對廣播的限制
從Android7.0已經(jīng)對廣播的做了限制。主要是對”CONNECTIVITY_ACTION”, “ ACTION_NEW_PICTURE or ACTION_NEW_VIDEO”三個廣播做了限制。Android 8.0 讓這些限制更為嚴(yán)格。
豁免列表可參見:https://blog.csdn.net/hqocshheqing/article/details/76850164
3.List.sort()集合的處理
在 Android 8.0 之前的平臺版本中,如果通過調(diào)用 List.sort() 進(jìn)行排序,則當(dāng)?shù)幚?ArrayList 以及在迭代過程中調(diào)用 sort() 時,會引發(fā)ConcurrentModificationException。而 Collections.sort() 則不會引發(fā)異常。現(xiàn)在,在Android8.0系統(tǒng),兩種方法都會引發(fā) ConcurrentModificationException。
4.Android8.0通知欄適配
在 Android 8.0 中,通知被重新設(shè)計,引入了NotificationChannel的概念。如果不需要使用8.0系統(tǒng)引入的新特性,只需注意創(chuàng)建通知對象時NotificationCompat.Builder builder = new NotificationCompat.Builder(context, Integer.toString(notificationId));方法第二個參數(shù)意義降發(fā)生變法,不再是通知ID,而是變成了通知channel,如果沒有按照NotificationChannel正確方法啟動通知,將會無法彈出消息通知界面
5.Android8.0未知來源應(yīng)用安裝權(quán)限方案
Android8.0的諸多新特性中有一個非常重要的特性:未知來源應(yīng)用權(quán)限。以前安裝未知來源應(yīng)用的時候一般會彈出一個彈窗讓用戶去設(shè)置允許還是拒絕,并且設(shè)置為允許之后,所有的未知來源的應(yīng)用都可以被安裝。Android8.0的變化是,引入未知來源應(yīng)用的管理列表(系統(tǒng)設(shè)置界面里面),需要在里面打開每個應(yīng)用的未知來源的安裝權(quán)限才能安裝應(yīng)用。應(yīng)用直接適配到Android8之后,內(nèi)部啟動應(yīng)用安裝是會被阻塞的,如果不處理好這個未知來源的權(quán)限,會導(dǎo)致應(yīng)用根本無法下載升級安裝,只能去應(yīng)用市場重新下載。
適配方案:https://blog.csdn.net/github_2011/article/details/78589514?locationnum=2&fps=1