[Android各版本特性]Android 8.0 Oreo

[Android各版本特性]專欄目錄
01. Android API 版本對照表
02. Android 4.4以前版本特性
03. 爲什麼以Android4.4做分界線
04. Android 4.4 Kitkat
05. Android 5.0 Android Lollipop
06. Android 6.0 Marshmallow
07. Android 7.0 Nougat
08. Android 8.0 Oreo
09. Android 9.0 Pie
10. Android 10
11. 總結(推薦)

Android8.0版本調整了很多東西,特別要注意的是:

  1. 後臺service限制。
  2. 無法繼續在清單中爲隱式廣播註冊廣播接收器。
  3. 後臺位置信息限制。
  4. 通知增加渠道ID
  5. 音頻焦點AudioFocusRequest變更。

1.通知

  1. 通知渠道:Android 8.0 引入了通知渠道,其允許您爲要顯示的每種通知類型創建用戶可自定義的渠道。用戶界面將通知渠道稱之爲通知類別。
  2. 通知標誌:Android 8.0 引入了對在應用啓動器圖標上顯示通知標誌的支持。通知標誌可反映某個應用是否存在與其關聯、並且用戶尚未予以清除也未對其採取行動的通知。通知標誌也稱爲通知點。
  3. 休眠:用戶可以將通知置於休眠狀態,以便稍後重新顯示它。重新顯示時通知的重要程度與首次顯示時相同。應用可以移除或更新已休眠的通知,但更新休眠的通知並不會使其重新顯示。
  4. 通知超時:現在,使用 setTimeoutAfter() 創建通知時您可以設置超時。您可以使用此函數指定一個持續時間,超過該持續時間後,通知應取消。如果需要,您可以在指定的超時持續時間之前取消通知。
  5. 通知設置:當您使用 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES Intent 從通知創建指向應用通知設置的鏈接時,您可以調用 setSettingsText() 來設置要顯示的文本。此係統可以提供以下 Extra 數據和 Intent,用於過濾應用必須向用戶顯示的設置:EXTRA_CHANNEL_ID、NOTIFICATION_TAG 和 NOTIFICATION_ID。
  6. 通知清除:系統現在可區分通知是由用戶清除,還是由應用移除。要查看清除通知的方式,您應實現 NotificationListenerService 類的新 onNotificationRemoved() 函數。
  7. 背景顏色:您現在可以設置和啓用通知的背景顏色。只能在用戶必須一眼就能看到的持續任務的通知中使用此功能。例如,您可以爲與駕車路線或正在進行的通話有關的通知設置背景顏色。您還可以使用 Notification.Builder.setColor() 設置所需的背景顏色。這樣做將允許您使用 Notification.Builder.setColorized() 啓用通知的背景顏色設置。
  8. 消息樣式:現在,使用 MessagingStyle 類的通知可在其摺疊形式中顯示更多內容。對於與消息有關的通知,您應使用 MessagingStyle 類。您還可以使用新的 addHistoricMessage() 函數,通過向與消息相關的通知添加歷史消息爲會話提供上下文。

2.畫中畫模式

Android 8.0 允許以畫中畫 (PIP) 模式啓動操作組件。PIP 是一種特殊的多窗口模式,最常用於視頻播放。當某個 Activity 處於 PIP 模式時,它會處於暫停狀態,但仍應繼續顯示內容。因此,您應確保您的應用在 onPause() 處理程序中進行處理時不會暫停播放。相反,您應在 onStop() 中暫停播放視頻,並在 onStart() 中繼續播放。

3.可下載字體

Android 8.0 和 Android 支持庫 26 允許您從提供程序應用請求字體,而無需將字體綁定到 APK 中或讓 APK 下載字體。此功能可減小 APK 大小,提高應用安裝成功率,使多個應用可以共享同一種字體。

4.XML 中的字體

Android 8.0 推出一項新功能,即 XML 中的字體,允許您使用字體作爲資源。這意味着,不再需要以資產的形式捆綁字體。字體在 R 文件中編譯,並且作爲一種資源,可自動用於系統。然後,您可以利用一種新的資源類型 font 來訪問這些字體。

在運行 API 版本 14 及更高版本的設備中,支持庫 26 對此功能提供完全支持。

5.自動調整 TextView 的大小

Android 8.0 允許您根據 TextView 的大小自動設置文本展開或收縮的大小。這意味着,在不同屏幕上優化文本大小或者優化包含動態內容的文本大小比以往簡單多了。

6.自適應圖標

Android 8.0 引入自適應啓動器圖標。自適應圖標支持視覺效果,可在不同設備型號上顯示爲各種不同的形狀。

7.顏色管理

圖像應用的 Android 開發者現在可以利用支持廣色域彩色顯示的新設備。要顯示廣色域圖像,應用需要在其清單(每個操作組件)中啓用一個標誌,並加載具有嵌入的廣域彩色配置文件(AdobeRGB、Pro Photo RGB、DCI-P3 等)的位圖。

8.多顯示器支持

從 Android 8.0 開始,此平臺爲多顯示器提供增強的支持。如果 Activity 支持多窗口模式,並且在具有多顯示器的設備上運行,則用戶可以將 Activity 從一個顯示器移動到另一個顯示器。當應用啓動 Activity 時,此應用可指定 Activity 應在哪個顯示器上運行。

9.統一的佈局外邊距和內邊距

Android 8.0 讓您可以更輕鬆地指定 View 元素的對邊使用相同外邊距和內邊距的情形。具體來說,您現在可以在佈局 XML 文件中使用以下屬性:

  • layout_marginVertical,同時定義 layout_marginTop 和 layout_marginBottom。
  • layout_marginHorizontal,同時定義 layout_marginLeft 和 layout_marginRight。
  • paddingVertical,同時定義 paddingTop 和 paddingBottom。
  • paddingHorizontal,同時定義 paddingLeft 和 paddingRight。

注意:請記住,這些屬性不會影響 layout_marginStart、layout_marginEnd、paddingStart 或 paddingEnd 的值。您可以自行設置這些值和新的垂直與水平佈局屬性來創建取決於文本方向的佈局行爲。

10.AnimatorSet

從 Android 8.0 開始,AnimatorSet API 現在支持尋道倒播功能。尋道功能允許您將動畫的位置設置爲指定的時間點處。如果您的應用包含可撤消的操作的動畫,倒播功能會很有用。現在,您不必定義兩組獨立的動畫,而只需反向播放同一組動畫。

11.緩存數據

Android 8.0 優化了緩存數據的導航和行爲。現在,每個應用均獲得一定的磁盤空間配額,用於存儲 getCacheQuotaBytes(UUID) 返回的緩存數據。

當系統需要釋放磁盤空間時,將開始從超過配額最多的應用中刪除緩存文件。因此,如果將您的緩存數據量始終保持低於配額的水平,則在必須清除系統中的某些文件時,您的緩存文件將能堅持到最後。系統在決定刪除您的應用中的哪些緩存文件時,將首先考慮刪除最舊的文件(由修改時間確定)。

您還可以針對每個目錄啓用兩種新行爲,以控制系統如何釋放緩存數據:

  • StorageManager.setCacheBehaviorAtomic() 可用於指示某個目錄及其所有內容應作爲一個不可分割的整體進行刪除。
  • setCacheBehaviorTombstone(File, boolean) 可用於指示不應刪除某個目錄內的文件,而應將它們截斷到 0 字節長度,使空文件保持完好。

最後,在需要爲大文件分配磁盤空間時,可考慮使用新的 allocateBytes(FileDescriptor, long) API,它將自動清除屬於其他應用的緩存文件(根據需要),以滿足您的請求。在確定設備是否有足夠的磁盤空間保存您的新數據時,請調用 getAllocatableBytes(UUID) 而不要使用 getUsableSpace(),因爲前者會考慮系統要爲您清除的任何緩存數據。

12.內容刷新請求

現在,ContentProvider 和 ContentResolver 類均包含 refresh() 函數,這樣,客戶端可以更輕鬆地知道所請求的信息是否爲最新信息。

您可以擴展 ContentProvider 以添加自定義的內容刷新邏輯。請務必重寫 refresh() 函數,以返回 true,告知提供程序的客戶端您已嘗試自行刷新數據。

您的客戶端應用可通過調用另一個函數(又稱 refresh()),顯式請求已刷新的內容。在調用此函數時,傳入待刷新數據的 URI。

:由於您可能通過網絡不斷請求數據,您應僅在有明顯跡象表明內容確已過時時才從客戶端調用 refresh()。執行此類內容刷新最常見的原因是響應滑動刷新手勢,該手勢顯式請求當前界面顯示最新內容。

13.JobScheduler 改進

Android 8.0 引入了對 JobScheduler 的多項改進。由於您通常可以使用計劃作業替代現在受限的後臺服務或隱式廣播接收器,這些改進可以讓您的應用更輕鬆地符合新的後臺執行限制。

JobScheduler 的更新包括:

  • 您現在可以將工作隊列與計劃作業關聯。要將一個工作項添加到作業的隊列中,請調用 JobScheduler.enqueue()。當作業運行時,它可以將待定工作從隊列中剝離並進行處理。這種功能可以處理之前需要啓動後臺服務(尤其是實現 IntentService 的服務)的許多用例。

  • 您現在可以通過調用 JobInfo.Builder.setClipData() 的方式將 ClipData 與作業關聯。利用此選項,您可以將 URI 權限授予與作業關聯,類似於這些權限傳遞到 Context.startService() 的方式。您也可以將 URI 權限授予用於工作隊列上的 intent。

  • 計劃作業現在支持多個新的約束條件:

    1. JobInfo.isRequireStorageNotLow() 如果設備的可用存儲空間非常低,作業將不會運行。
    2. JobInfo.isRequireBatteryNotLow() 如果電池電量等於或低於臨界閾值,作業將不會運行;臨界閾值是指設備顯示 Low battery warning 系統對話框的電量。
    3. NETWORK_TYPE_METERED 作業需要一個按流量計費的網絡連接,比如大多數移動數據網絡數據套餐。

14.顯式請求音頻焦點

您的服務可以使用 requestAudioFocus() 函數提交一個更精細的設備級音頻焦點接收請求。傳入一個 AudioFocusRequest 對象,您可以使用 AudioFocusRequest.Builder 創建這個對象。在這個構建類中,您可以指定以下選項:

  • 您希望獲得的焦點類型,例如 AUDIOFOCUS_GAIN_TRANSIENT 或 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。
  • 當另一個音頻服務獲得設備焦點時,您的服務應以更安靜的方式繼續,還是完全暫停。
  • 您的服務能否等待獲得焦點,直至設備就緒。

:構建您的 AudioFocusRequest 實例時,如果您通過調用 setAcceptsDelayedFocusGain() 指示您的服務可以等待產生聲音,您也必須調用 setOnAudioFocusChangeListener(),以便您的服務瞭解它何時可以開始產生聲音。

15.藍牙

Android 8.0 通過增加以下功能,增強了平臺對藍牙的支持:

  • 支持 AVRCP 1.4 標準,該標準支持音樂庫瀏覽。
  • 支持藍牙低功耗 (BLE) 5.0 標準。
  • 將 Sony LDAC 編解碼器集成到藍牙堆疊中。

16.權限

Android 8.0 引入了多個與電話有關的新權限:

  • ANSWER_PHONE_CALLS 允許您的應用通過編程方式接聽呼入電話。要在您的應用中處理呼入電話,您可以使用 acceptRingingCall() 函數。
  • READ_PHONE_NUMBERS 權限允許您的應用讀取設備中存儲的電話號碼。

這些權限均被劃分爲危險類別,屬於 PHONE 權限組。

在 Android 8.0 之前,如果應用在運行時請求權限並且被授予該權限,系統會錯誤地將屬於同一權限組並且在清單中註冊的其他權限也一起授予應用。

對於針對 Android 8.0 的應用,此行爲已被糾正。系統只會授予應用明確請求的權限。然而,一旦用戶爲應用授予某個權限,則所有後續對該權限組中權限的請求都將被自動批准。

*17.後臺執行限制

Android 8.0 爲提高電池續航時間而引入的變更之一是,當您的應用進入已緩存狀態時,如果沒有活動的組件,系統將解除應用具有的所有喚醒鎖。

此外,爲提高設備性能,系統會限制未在前臺運行的應用的某些行爲。具體而言:

  • 現在,在後臺運行的應用對後臺服務的訪問受到限制。
  • 應用無法使用其清單註冊大部分隱式廣播(即,並非專門針對此應用的廣播)。

默認情況下,這些限制僅適用於針對 O 的應用。不過,用戶可以從 Settings 屏幕爲任意應用啓用這些限制,即使應用並不是以 O 爲目標平臺。

Android 8.0 還對特定函數做出了以下變更:

  • 如果針對 Android 8.0 的應用嘗試在不允許其創建後臺服務的情況下使用 startService() 函數,則該函數將引發一個 IllegalStateException。
  • 新的 Context.startForegroundService() 函數將啓動一個前臺服務。現在,即使應用在後臺運行,系統也允許其調用 Context.startForegroundService()。不過,應用必須在創建服務後的五秒內調用該服務的 startForeground() 函數。

18.Android 後臺位置限制

爲節約電池電量、保持良好的用戶體驗和確保系統健康運行,在運行 Android 8.0 的設備上使用後臺應用時,降低了後臺應用接收位置更新的頻率。此行爲變更會影響包括 Google Play 服務在內的所有接收位置更新的應用。

19.網絡連接和 HTTP(S) 連接

Android 8.0 對網絡連接和 HTTP(S) 連接行爲做出了以下變更:

  • 無正文的 OPTIONS 請求具有 Content-Length: 0 標頭。之前,這些請求沒有 Content-Length 標頭。

  • HttpURLConnection 在包含斜線的主機或頒發機構名稱後面附加一條斜線,使包含空路徑的網址規範化。例如,它將 http://example.com 轉化爲 http://example.com/。

  • 通過 ProxySelector.setDefault() 設置的自定義代理選擇器僅針對所請求的網址(架構、主機和端口)。因此,僅可根據這些值選擇代理。傳遞至自定義代理選擇器的網址不包含所請求的網址的路徑、查詢參數或片段。

  • URI 不能包含空白標籤。
    之前,平臺支持一種權宜方法,即允許主機名稱中包含空白標籤,但這是對 URI 的非法使用。此權宜方法只是爲了確保與舊版 libcore 兼容。開發者如果對 API 使用不當,將會看到一條 ADB 消息:“URI example…com 的主機名包含空白標籤。此格式不正確,將不被未來的 Android 版本所接受。”Android 8.0 廢除了此權宜方法;系統對格式錯誤的 URI 會返回 null。

  • Android 8.0 在實現 HttpsURLConnection 時不會執行不安全的 TLS/SSL 協議版本回退。

  • 對隧道 HTTP(S) 連接處理進行了如下變更:

    • 在通過連接建立隧道 HTTP(S) 連接時,系統會在 Host 行中正確放置端口號 (:443) 並將此信息發送至中間服務器。之前,端口號僅出現在 CONNECT 行中。

    • 系統不再將隧道連接請求中的 user-agent 和 proxy-authorization 標頭髮送至代理服務器。
      在建立隧道時,系統不再將隧道 Http(s)URLConnection 中的 proxy-authorization 標頭髮送至代理。相反,由系統生成 proxy-authorization 標頭,在代理響應初始請求發送 HTTP 407 後將其發送至此代理。

      同樣地,系統不再將 user-agent 標頭由隧道連接請求複製到建立隧道的代理請求。相反,庫爲此請求生成 user-agent 標頭。

  • 如果之前執行的 connect() 函數失敗,send(java.net.DatagramPacket) 函數將會引發 SocketException。

    • 如果存在內部錯誤,DatagramSocket.connect() 會引發 pendingSocketException。對於 Android 8.0 之前的版本,即使 send() 調用成功,後續的 recv() 調用也會引發 SocketException。爲確保一致性,現在這兩個調用均會引發 SocketException。
  • 在回退到 TCP Echo 協議之前,InetAddress.isReachable() 會嘗試執行 ICMP。

    • 對於某些屏蔽端口 7 (TCP Echo) 的主機(例如 google.com),如果它們接受 ICMP Echo 協議,現在也許能夠訪問它們。
    • 對於確實無法訪問的主機,此項變更意味着調用需要兩倍的時間才能返回結果。
發佈了39 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章