Android5.0
1.虛擬機(jī)
在 Android 5.0 中,全面由Dalvik轉(zhuǎn)用ART(Android Runtime)編譯。大大提高了性能。
- 預(yù)先 (AOT) 編譯
- 改進(jìn)的垃圾回收 (GC)
- 改進(jìn)的調(diào)試支持
2.Material Design 樣式
采用全新Material Design設(shè)計(jì),頁(yè)面更加的美觀,立體。
3.浮動(dòng)通知
設(shè)備未鎖定且其屏幕處于打開(kāi)狀態(tài),通知可以顯示在小型浮動(dòng)窗口中,稱(chēng)為浮動(dòng)通知。
4.綁定服務(wù)
啟動(dòng)或綁定服務(wù)必須顯式啟動(dòng),如果隱式啟動(dòng),會(huì)引發(fā)下列異常:
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit
如果非要隱式啟動(dòng),可以使用下列方案來(lái)避免異常:
val intent = Intent("Service對(duì)應(yīng)的Action")
intent.`package` = packageName
bindService(intent,mServiceConnection,BIND_AUTO_CREATE)
Android6.0
1.運(yùn)行時(shí)權(quán)限
用戶可直接在運(yùn)行時(shí)管理應(yīng)用權(quán)限。這種模式讓用戶能夠更好地了解和控制權(quán)限,同時(shí)為應(yīng)用開(kāi)發(fā)者精簡(jiǎn)了安裝和自動(dòng)更新過(guò)程。用戶可為所安裝的各個(gè)應(yīng)用分別授予或撤銷(xiāo)權(quán)限。
//檢測(cè)某個(gè)權(quán)限是否已經(jīng)被授予
//PackageManager.PERMISSION_GRANTE:獲得權(quán)限
//PackageManager.PERMISSION_DENIED:為獲得權(quán)限
ContextCompat.checkSelfPermission(Context context,String permission)
//申請(qǐng)權(quán)限
ActivityCompat.requestPermissions(Activity activity,String[] permissions, int requestCode)
//處理授權(quán)
onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
//解釋說(shuō)明權(quán)限的用途
ActivityCompat.shouldShowRequestPermissionRationale(Activity activity,String permission)
2.低電耗模式和應(yīng)用待機(jī)模式
低電耗模式:如果用戶拔下設(shè)備的電源插頭,并在屏幕關(guān)閉后的一段時(shí)間內(nèi)使其保持不活動(dòng)狀態(tài),設(shè)備會(huì)進(jìn)入
低電耗模式
。 在該模式下設(shè)備會(huì)嘗試讓系統(tǒng)保持休眠狀態(tài)
。在該模式下,設(shè)備會(huì)定期短時(shí)間恢復(fù)正常工作,以便進(jìn)行應(yīng)用同步,還可讓系統(tǒng)執(zhí)行任何掛起的操作
。應(yīng)用待機(jī)模式:應(yīng)用待機(jī)模式允許系統(tǒng)判定應(yīng)用在用戶未主動(dòng)使用它時(shí)處于空閑狀態(tài)。當(dāng)用戶有一段時(shí)間未觸摸應(yīng)用時(shí),系統(tǒng)便會(huì)作出此判定。如果拔下了設(shè)備電源插頭,系統(tǒng)會(huì)為其視為空閑的應(yīng)用
停用網(wǎng)絡(luò)訪問(wèn)以及暫停同步和作業(yè)
。
在低電耗模式下,您的應(yīng)用會(huì)受到以下限制:
- 暫停訪問(wèn)網(wǎng)絡(luò)
- 系統(tǒng)忽略喚醒鎖定
- 標(biāo)準(zhǔn)AlarmManager鬧鐘推遲到下一個(gè)維護(hù)期
- 系統(tǒng)不執(zhí)行WLAN掃描
- 系統(tǒng)不允許運(yùn)行同步適配器SyncAdapter
- 系統(tǒng)不允許運(yùn)行JobScheduler
3.取消支持 Apache HTTP
Android 6.0版移除了對(duì) Apache HTTP
的支持,推薦使用HttpURLConnection
,因?yàn)樗梢酝ㄟ^(guò)透明壓縮和響應(yīng)緩存減少網(wǎng)絡(luò)使用,并可最大限度降低耗電量。
如果想繼續(xù)使用Apache HTTP
,必須先在build.gradle文件中如下聲明:
android {
useLibrary 'org.apache.http.legacy'
}
Android7.0
1.文件訪問(wèn)權(quán)限
為了提高私有文件的安全性,應(yīng)用私有目錄
被限制訪問(wèn),此設(shè)置可防止私有文件的元數(shù)據(jù)泄漏,如它們的大小或存在性。
-
無(wú)法使用file://這樣的形式訪問(wèn)文件,不然會(huì)報(bào)錯(cuò)
FileUriExposedException
,現(xiàn)在改用FileProvide來(lái)訪問(wèn)文件。
<manifest>
...
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
file_paths.xml
文件內(nèi)容:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<files-path path="files" name="files" />
<cache-path path="files" name="cache" />
...
</paths>
</resources>
- path:文件夾“相對(duì)路徑”
- name:名稱(chēng)標(biāo)志字符,不能重名。
標(biāo)簽 | 路徑 |
---|---|
files-path | getFilesDir() |
cache-path | getCacheDir() |
external-path | Environment.getExternalStorageDirectory() |
external-files-path | getExternalFilesDir() |
external-cache-path | getExternalCacheDir() |
external-media-path | getExternalMediaDirs() |
root-path | / |
<files-path path="image" name="files" />
:對(duì)應(yīng)的文件路徑為:getFilesDir() / image/
- DownloadManager不再按文件名分享私人存儲(chǔ)的文件。
2.移除三項(xiàng)隱式廣播
- CONNECTIVITY_ACTION:網(wǎng)絡(luò)狀態(tài)監(jiān)聽(tīng)。
- ACTION_NEW_PICTURE:拍照廣播
- ACTION_NEW_VIDEO:錄視頻廣播
注意:移除的是
隱式廣播
。正在前臺(tái)運(yùn)行的應(yīng)用程序如果在主線程中動(dòng)態(tài)注冊(cè)
了該廣播,該應(yīng)用程序仍然可以接收到該廣播。
3.進(jìn)一步優(yōu)化低電耗模式
Android 6.0引入了低電耗模式
,當(dāng)用戶設(shè)備未插接電源、處于靜止?fàn)顟B(tài)且屏幕關(guān)閉時(shí),該模式會(huì)推遲 CPU和網(wǎng)絡(luò)活動(dòng),從而延長(zhǎng)電池壽命。而Android 7.0則通過(guò)在設(shè)備未插接電源且屏幕關(guān)閉狀態(tài)下、但不一定要處于靜止?fàn)顟B(tài)
(例如用戶外出時(shí)把手持式設(shè)備裝在口袋里)時(shí)應(yīng)用部分CPU和網(wǎng)絡(luò)限制,進(jìn)一步增強(qiáng)了低電耗模式
。
Android8.0
1.后臺(tái)執(zhí)行限制
- 在后臺(tái)運(yùn)行的應(yīng)用對(duì)后臺(tái)服務(wù)的訪問(wèn)受到限制。
- 應(yīng)用無(wú)法使用其清單注冊(cè)大部分隱式廣播。
如果在后臺(tái)服務(wù)中調(diào)用startService()
,則會(huì)拋出IllegalStateException
。 調(diào)用Context.startForegroundService()
將啟動(dòng)一個(gè)前臺(tái)服務(wù)。即使應(yīng)用在后臺(tái)運(yùn)行,系統(tǒng)也允許其調(diào)用 Context.startForegroundService()
。不過(guò),應(yīng)用必須在創(chuàng)建服務(wù)后的五秒內(nèi)調(diào)用該服務(wù)的startForeground()
。
2.后臺(tái)位置限制
為節(jié)約電池電量、保持良好的用戶體驗(yàn)和確保系統(tǒng)健康運(yùn)行,在運(yùn)行Android 8.0的設(shè)備上使用后臺(tái)應(yīng)用時(shí)
,降低了后臺(tái)應(yīng)用接收位置更新的頻率
。此行為變更會(huì)影響包括Google Play服務(wù)在內(nèi)的所有接收位置更新的應(yīng)用。
影響的API:
- Fused Location Provider (FLP)
- Geofencing
- GNSS Measurements
- Location Manager
- Wi-Fi Manager
3.通知
在Android 8.0中,我們已重新設(shè)計(jì)通知,以便為管理通知行為和設(shè)置提供更輕松和更統(tǒng)一的方式。這些變更包括以下內(nèi)容:
-
通知渠道:
Android 8.0
引入了通知渠道
,其允許您為要顯示的每種通知類(lèi)型創(chuàng)建用戶可自定義的渠道。用戶界面將通知渠道稱(chēng)之為通知類(lèi)別
。
從Android 8.0(API 級(jí)別 26)開(kāi)始,必須為所有通知分配渠道,否則通知將不會(huì)顯示。通過(guò)將通知?dú)w類(lèi)為不同的
渠道
,用戶可以停用您應(yīng)用的特定通知渠道(而非停用您的所有通知),還可以控制每個(gè)渠道的視覺(jué)和聽(tīng)覺(jué)選項(xiàng)。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//創(chuàng)建通知渠道
val name = getString(R.string.channel_name)
val descriptionText = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
mChannel.description = descriptionText
//注冊(cè)渠道
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
-
通知標(biāo)志:
Android 8.0
引入了對(duì)在應(yīng)用啟動(dòng)器圖標(biāo)上顯示通知標(biāo)志的支持。通知標(biāo)志可反映某個(gè)應(yīng)用是否存在與其關(guān)聯(lián)、并且用戶尚未予以清除也未對(duì)其采取行動(dòng)的通知。通知標(biāo)志也稱(chēng)為通知點(diǎn)
(強(qiáng)迫癥非常討厭的東西)。 - 背景顏色:您現(xiàn)在可以設(shè)置和啟用通知的背景顏色。只能在用戶必須一眼就能看到的持續(xù)任務(wù)的通知中使用此功能。例如,您可以為與駕車(chē)路線或正在進(jìn)行的通話有關(guān)的通知設(shè)置背景顏色。
-
消息樣式:使用
MessagingStyle類(lèi)
的通知可在其折疊形式中顯示更多內(nèi)容。對(duì)于與消息有關(guān)的通知,您應(yīng)使用MessagingStyle類(lèi)
。您還可以使用新的addHistoricMessage()
,通過(guò)向與消息相關(guān)的通知添加歷史消息為會(huì)話提供上下文。 -
通知清除:系統(tǒng)現(xiàn)在可區(qū)分通知是由用戶清除,還是由應(yīng)用移除。通過(guò)
NotificationListenerService類(lèi)
的onNotificationRemoved()
。 - 休眠:用戶可以將通知置于休眠狀態(tài),以便稍后重新顯示它。重新顯示時(shí)通知的重要程度與首次顯示時(shí)相同。應(yīng)用可以移除或更新已休眠的通知,但更新休眠的通知并不會(huì)使其重新顯示。
-
通知超時(shí):使用
setTimeoutAfter()
創(chuàng)建通知時(shí)您可以設(shè)置超時(shí)。您可以使用此函數(shù)指定一個(gè)持續(xù)時(shí)間,超過(guò)該持續(xù)時(shí)間后,通知應(yīng)取消。如果需要,您可以在指定的超時(shí)持續(xù)時(shí)間之前取消通知。
4.自適應(yīng)圖標(biāo)
Android 8.0(API 級(jí)別 26)
引入了自適應(yīng)啟動(dòng)器圖標(biāo),它可以在不同設(shè)備型號(hào)上顯示為不同的形狀。例如,在一臺(tái)原始設(shè)備制造商 (OEM) 設(shè)備上,自適應(yīng)啟動(dòng)器圖標(biāo)可顯示為圓形,而在其他設(shè)備上則可顯示為方圓形。每個(gè)設(shè)備的原始設(shè)備制造商 (OEM) 都會(huì)提供一個(gè)蒙版,系統(tǒng)使用該蒙版渲染所有具有相同形狀的自適應(yīng)圖標(biāo)。自適應(yīng)啟動(dòng)器圖標(biāo)還會(huì)在快捷方式、“設(shè)置”應(yīng)用、共享對(duì)話框和概覽屏幕中使用。
Android9.0
1.電源管理
- 應(yīng)用待機(jī)群組:系統(tǒng)將根據(jù)用戶的使用模式限制應(yīng)用對(duì) CPU 或電池等設(shè)備資源的訪問(wèn)。
-
省電模式改進(jìn):開(kāi)啟省電模式后,系統(tǒng)會(huì)對(duì)所有應(yīng)用施加限制。 這是一項(xiàng)已有的功能,但在
Android 9
中得到了改進(jìn)。
2.隱私權(quán)變更
后臺(tái)對(duì)傳感器的訪問(wèn)受限:Android 9
限制后臺(tái)應(yīng)用訪問(wèn)用戶輸入和傳感器數(shù)據(jù)的能力。 如果您的應(yīng)用在運(yùn)行 Android 9
設(shè)備的后臺(tái)運(yùn)行,系統(tǒng)將對(duì)您的應(yīng)用采取以下限制:
- 您的應(yīng)用不能訪問(wèn)麥克風(fēng)或攝像頭。
- 使用連續(xù)報(bào)告模式的傳感器(例如加速度計(jì)和陀螺儀)不會(huì)接收事件。
- 使用變化或一次性報(bào)告模式的傳感器不會(huì)接收事件。
如果需要在運(yùn)行
Android 9
的設(shè)備上檢測(cè)傳感器事件,請(qǐng)使用前臺(tái)服務(wù)。
限制訪問(wèn)通話記錄:Android 9
引入CALL_LOG權(quán)限組
并將READ_CALL_LOG、WRITE_CALL_LOG和PROCESS_OUTGOING_CALLS
權(quán)限移入該組。 在之前的Android版本
中,這些權(quán)限位于PHONE權(quán)限組
。
如果您的應(yīng)用需要訪問(wèn)通話記錄或者需要處理去電,則您必須向CALL_LOG權(quán)限組
明確請(qǐng)求這些權(quán)限。 否則會(huì)發(fā)生SecurityException
。
3.對(duì)使用非 SDK 接口的限制
為幫助確保應(yīng)用穩(wěn)定性和兼容性,此平臺(tái)對(duì)某些非SDK函數(shù)
和字段
的使用進(jìn)行了限制;無(wú)論您是直接訪問(wèn)這些函數(shù)
和字段
,還是通過(guò)反射或 JNI 訪問(wèn),這些限制均適用。 在 Android 9 中
,您的應(yīng)用可以繼續(xù)訪問(wèn)這些受限的接口;該平臺(tái)通過(guò) toast
和日志條目提醒您注意這些接口。 如果您的應(yīng)用顯示這樣的 toast
,則必須尋求受限接口之外的其他實(shí)現(xiàn)策略。
4.框架安全性變更
默認(rèn)啟用網(wǎng)絡(luò)傳輸層安全協(xié)議 (TLS):默認(rèn)使用https
,會(huì)阻止http
請(qǐng)求,如果想繼續(xù)使用http
可以在清單文件中做如下配置:
<application
...
android:usesCleartextTraffic="true">
...
</application>
5.Apache HTTP棄用
在Android 6.0 中
,我們移除了對(duì) Apache HTTP
的支持。從· Android 9 開(kāi)始·,該內(nèi)容庫(kù)已從 bootclasspath
中移除,且默認(rèn)情況下應(yīng)用無(wú)法使用它。要繼續(xù)使用Apache HTTP
,以Android 9
及更高版本為目標(biāo)平臺(tái)的應(yīng)用可以向其 AndroidManifest.xml
添加以下內(nèi)容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
6.前臺(tái)服務(wù)
如果應(yīng)用以Android 9
或更高版本為目標(biāo)平臺(tái)并使用前臺(tái)服務(wù),則必須請(qǐng)求FOREGROUND_SERVICE
權(quán)限。這是普通權(quán)限,因此,系統(tǒng)會(huì)自動(dòng)為請(qǐng)求權(quán)限的應(yīng)用授予此權(quán)限。
如果以Android 9
或更高版本為目標(biāo)平臺(tái)的應(yīng)用嘗試創(chuàng)建前臺(tái)服務(wù)且未請(qǐng)求FOREGROUND_SERVICE
,則系統(tǒng)會(huì)拋出SecurityException
。