天天看點

Android 9 新特性

Android 9.0是谷歌開發的Android作業系統,最早于2018年1月25日出現在谷歌官網,2018年2月,Android 9.0的初步代号定為Pistachio Ice Cream,中文暫譯為開心果冰淇淋。經過Android 8.0之後,Android 9.0系統功能進一步完善,Android 9.0主要新增了谷歌統一推送更新、深度內建Project Treble模式、更加封閉、原生支援通話錄音等功能,下面就讓我們一探究竟。

利用 Wi-Fi RTT 進行室内定位

Android 9 添加了對 IEEE 802.11mc Wi-Fi 協定(也稱為 Wi-Fi Round-Trip-Time (RTT))的平台支援,進而讓您的應用可以利用室内定位功能。

在運作 Android 9 且具有硬體支援的裝置上,應用可以使用 RTT API 來測量與附近支援 RTT 的 Wi-Fi 接入點 (AP) 的距離。 裝置必須已啟用位置服務并開啟 Wi-Fi 掃描(在 Settings > Location 下),同時您的應用必須具有 ACCESS_FINE_LOCATION 權限。

裝置無需連接配接到接入點即可使用 RTT。 為了保護隐私,隻有手機可以确定與接入點的距離;接入點無此資訊。

如果您的裝置測量與 3 個或更多接入點的距離,您可以使用一個多點定位算法來預估與這些測量值最相符的裝置位置。 結果通常精準至 1 至 2 米。

通過這種精确性,您可以打造新的體驗,例如樓内導航、基于精細位置的服務,如無歧義語音控制(例如,“打開這盞燈”),以及基于位置的資訊(如 “此産品是否有特别優惠?”)。

Android 9 新特性

屏缺口支援

Android 9 支援最新的全面屏,其中包含為攝像頭和揚聲器預留白間的螢幕缺口。 通過 DisplayCutout 類可确定非功能區域的位置和形狀,這些區域不應顯示内容。 要确定這些螢幕缺口區域是否存在及其位置,請使用 getDisplayCutout() 函數。

全新的視窗布局屬性 layoutInDisplayCutoutMode 讓您的應用可以為裝置螢幕缺口周圍的内容進行布局。 您可以将此屬性設為下列值之一:

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER      

可以按以下方法在任何運作 Android 9 的裝置或模拟器上模拟螢幕缺口:

啟用開發者選項。

在 Developer options 螢幕中,向下滾動至 Drawing 部分并選擇 Simulate a display with a cutout。

選擇螢幕缺口的大小。

注:我們建議您通過使用運作 Android 9 的裝置或模拟器測試螢幕缺口周圍的内容顯示。

Android 9 新特性

通知

Android 9 引入了多個通知增強功能,可供以 API 級别 28 及以上版本作為目标平台的開發者使用。

短信通知

從 Android 7.0(API 級别 24)開始,您可以添加一個操作以回複短信或直接從通知中輸入其他文本。 Android 9 通過下列增強提升了該功能:

  • 簡化了針對對話參與者的支援:Person 類可用于識别參與對話的人員,包括他們的頭像和 URI。 現在,許多其他 API(如 addMessage())均可利用 [Person] 類而不是 CharSequence。 Person 類也支援建構器設計模式。
  • 支援圖像:現在,Android 9 可在手機的“短信通知”中顯示圖像。 您可以使用對短信使用 setData()來顯示圖像。 以下代碼段示範了如何建立 Person 和包含圖像的短信。

例如,附帶照片的MessagingStyle

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);      
Android 9 新特性
  • 将回複另存為草稿:當使用者無意中關閉一個短信通知時,您的應用可以檢索系統發送的 EXTRA_REMOTE_INPUT_DRAFT。您可以使用此 extra 預填充應用中的文本字段,以便使用者可以完成他們的回複。
  • 确定對話是否為群組對話。您可以使用 setGroupConversation() 以明确确定對話是否為群組對話。
  • 為 Intent 設定語義操作:setSemanticAction()函數允許您為操作提供語義含義,如“标記為已讀”、“删除”和“回複”等。
  • SmartReply:Android 9 支援在您的短信應用中提供相同的建議回複。 使用 RemoteInput.setChoices()為使用者提供一組标準回複。

管道設定、廣播和請勿打擾

Android 8.0 引入了通知管道,允許您為要顯示的每種通知類型建立可由使用者自定義的管道。 Android 9 通過下列變更簡化通知管道設定:

  • 屏蔽管道組:現在,使用者可以針對某個應用在通知設定中屏蔽整個管道組。 您可以使用 isBlocked()函數确定何時屏蔽一個管道組,進而不會向該組中的管道發送任何通知。

此外,您的應用可以使用全新的 getNotificationChannelGroup() 函數查詢目前管道組設定。

  • 全新的廣播 Intent 類型:現在,當通知管道和管道組的屏蔽狀态發生變更時,Android 系統将發送廣播 Intent。擁有已屏蔽的管道或管道組的應用可以偵聽這些 Intent 并做出相應的回應。 有關這些 Intent 操作和 extra的更多資訊,請參閱 NotificationManager 參考中更新的常量清單。
  • NotificationManager.Policy 有 3 種新的“請勿打擾”優先級類别:
PRIORITY_CATEGORY_ALARMS 優先處理警報。
PRIORITY_CATEGORY_MEDIA 優先處理媒體源的聲音,如媒體和語音導航。
PRIORITY_CATEGORY_SYSTEM 優先處理系統聲音。      
  • NotificationManager.Policy 還有 7 種新的“請勿打擾”常量,可以用來抑制視覺中斷:
SUPPRESSED_EFFECT_FULL_SCREEN_INTENT 防止通知啟動全屏 Activity。
SUPPRESSED_EFFECT_LIGHTS 屏蔽通知燈。
SUPPRESSED_EFFECT_PEEK 防止通知短暫進入視圖(“滑出”)。
SUPPRESSED_EFFECT_STATUS_BAR 防止通知顯示在支援狀态欄的裝置的狀态欄中。
SUPPRESSED_EFFECT_BADGE 在支援标志的裝置上屏蔽标志。 如需了解詳細資訊,請參閱修改通知标志。
SUPPRESSED_EFFECT_AMBIENT 在支援微光顯示的裝置上屏蔽通知。
SUPPRESSED_EFFECT_NOTIFICATION_LIST 防止通知顯示在支援清單視圖(如通知欄或鎖屏)的裝置的清單視圖中。      

多攝像頭支援和攝像頭更新

在運作 Android 9 的裝置上,您可以通過兩個或更多實體攝像頭來同時通路多個視訊流。在配備雙前置攝像頭或雙後置攝像頭的裝置上,您可以建立隻配備單攝像頭的裝置所不可能實作的創新功能,例如無縫縮放、背景虛化和立體成像。 通過該 API,您還可以調用邏輯或融合的攝像頭視訊流,該視訊流可在兩個或更多攝像頭之間自動切換。

攝像頭方面的其他改進還包括附加會話參數和 Surface 共享,前者有助于降低首次拍照期間的延遲,而後者則讓攝像頭用戶端能夠處理各種用例,而無需停止并啟動攝像頭視訊流。 我們還針對基于顯示屏的 flash 支援和 OIS 時間戳通路新增了一些 API,用以實作應用級的圖像穩定化和特效。

在 Android 9 中,多攝像頭 API支援單色攝像頭,适用于具有 FULL 或 LIMITED 功能的裝置。 單色輸出通過 YUV_420_888 格式實作,Y 為灰階,U (Cb) 為 128,V (Cr) 為 128。

在受支援的裝置上,Android 9 還支援外置 USB/UVC 攝像頭。

ImageDecoder

Android 9 引入了 ImageDecoder 類,可提供現代化的圖像解碼方法。 使用該類取代 BitmapFactory 和 BitmapFactory.Options API。

ImageDecoder 讓您可通過位元組緩沖區、檔案或 URI 來建立 Drawable 或 Bitmap。 要解碼圖像,請首先以編碼圖像的來源為參數,調用 createSource()。 然後,通過傳遞 ImageDecoder.Source 對象來調用 decodeDrawable() 或 decodeBitmap(),進而建立 Drawable]或 Bitmap。 要更改預設設定,請将 OnHeaderDecodedListener 傳遞給 decodeDrawable() 或 decodeBitmap()。 ImageDecoder 調用 onHeaderDecoded(),以圖像的預設寬度和高度(若已知)為參數。 如果編碼圖像是動畫 GIF 或 WebP,decodeDrawable() 将傳回 Drawable,它是 AnimatedImageDrawable 類的一個執行個體。

您可以使用不同的方法來設定圖像屬性:

  • 要将解碼的圖像縮放到精确尺寸,請将目标尺寸傳遞給 setTargetSize()。 您也可以使用樣圖尺寸來縮放圖像。 将樣圖尺寸直接傳遞給setTargetSampleSize()。
  • 要在縮放圖像的範圍内裁剪圖像,請調用 setCrop()。
  • 要建立可變位圖,請将 true 傳遞給 setMutableRequired()。

通過 ImageDecoder 還可以為圓角或圓形遮罩之類的圖像添加複雜的定制效果。 以 PostProcessor 類的一個執行個體作為參數使用 setPostProcessor(),執行您所需的任何繪圖指令。

注:對 AnimatedImageDrawable進行後處理時,效果會出現在動畫的所有幀中。

動畫

Android 9 引入了 AnimatedImageDrawable 類,用于繪制和顯示 GIF 和 WebP 動畫圖像。 AnimatedImageDrawable 的工作方式與 AnimatedVectorDrawable 的相似之處在于,都是渲染線程驅動 AnimatedImageDrawable 的動畫。 渲染線程還使用工作線程進行解碼,是以,解碼不會幹擾渲染線程的其他操作。 這種實作機制允許您的應用在顯示動畫圖像時,無需管理其更新,也不會幹擾應用界面線程上的其他事件。

可使用 ImageDecoder 的執行個體對 AnimatedImageDrawable 進行解碼。 以下代碼段示範如何使用 ImageDecoder 來解碼 AnimatedImageDrawable:

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.      

ImageDecoder 有幾個允許您進一步修改圖像的函數。 例如,可使用 setPostProcessor() 函數來修改圖像的外觀,如應用圓形遮罩或圓角。

HDR VP9 視訊、HEIF 圖像壓縮和 Media API

Android 9 新增了對 High Dynamic Range (HDR) VP9 Profile 2 的内置支援,是以,現在您可以在支援 HDR 的裝置上為使用者提供來自 YouTube、Play Movies 和其他來源的采用 HDR 的影片。

Android 9 為平台增加了對 HEIF (heic) 圖像編碼的支援。 MediaMuxer 和 MediaExtractor 類中可支援 HEIF 靜态圖像示例 HEIF 改進了壓縮,可節省存儲空間和網絡資料流量。 借助 Android 9 裝置上的平台支援,從後端伺服器發送和使用 HEIF 圖像輕而易舉。 確定應用相容這種便于共享和顯示的資料格式後,嘗試在應用中使用 HEIF 作為圖像存儲格式。 您可以使用 ImageDecoder 或 BitmapFactory 進行 jpeg 到 heicto 的轉換,以通過 jpeg 擷取位圖,并且可以使用 HeifWriter 寫入來自 YUV 位元組緩沖區、Surface 或 Bitmap 的 HEIF 靜态圖像。

還可通過 AudioTrack、AudioRecord 和 MediaDrm 類擷取媒體名額。

Android 9 向 MediaDRM 類添加了函數以擷取名額、高帶寬數字内容保護 (HDCP) 級别、安全級别和會話數,并對安全性級别和安全停止進行更多控制。 如需了解更多詳情,請參閱 API 差異報告。

在 Android 9 中,AAudio API 包含 AAudioStream 屬性,用于 usage、content type 和 input preset。 使用這些屬性可以建立針對 VoIP 或錄影機應用調整的流。 您還可以設定 SessionID将 AAudio 流與可包含音效的子混音相關聯。 使用 AudioEffect API 來控制音效。

Android 9 包含一個用于 DynamicsProcessing 的 AudioEffect API。 借助該類,可以建構基于通道的音效,由各種類型(包括均衡、多頻帶壓縮和限幅器)的多個階段組成。 頻帶和活動階段的數量可配置,而且大多數參數可實時控制。

JobScheduler

從 Android 9 開始,JobScheduler 可以使用營運商提供的網絡狀态信号來改善與網絡有關的作業處理。

作業可以聲明其預估的資料大小、信号預提取,并指定具體的網絡要求。 JobScheduler 然後根據網絡狀态管理工作。 例如,當網絡顯示擁塞時,JobScheduler 可能會延遲較大的網絡請求。 如果使用的是不按流量計費的網絡,則 JobScheduler 可運作預提取作業以提升使用者體驗(例如預提取标題)。

添加作業時,確定使用 setEstimatedNetworkBytes()、setPrefetch() 和 setRequiredNetwork()(如果适用),以幫助 JobScheduler 正确處理工作。 在執行作業時,請確定使用 JobParameters.getNetwork() 傳回的 Network 對象。 否則,您将隐式使用裝置的預設網絡,其可能不符合您的要求,進而導緻意外的流量消耗。

Neural Networks API 1.1

Android 8.1(API 級别 27)中引入了 Neural Networks API 以加快 Android 裝置上機器學習的速度。 Android 9 擴充和改進了該 API,增加了對九種新運算的支援:

元素級數學運算

  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_SUB

數組運算

  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_TRANSPOSE
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_MEAN

此外,API 還引入了一個新函數,即 ANeuralNetworksModel_relaxComputationFloat32toFloat16(),允許您指定是否計算範圍和精度低至 IEEE 754 16 位浮點格式的 ANEURALNETWORKS_TENSOR_FLOAT32。

自動填充架構

Android 9 引入了多項改進,自動填充服務可以利用這些改進進一步增強使用者填寫表單時的體驗。 如需詳細了解如何在您的應用中使用自動填充功能,請參閱自動填充架構指南。

安全增強功能

Android 9 引入了若幹安全功能,詳見以下各節摘要說明:

Android Protected Confirmation

運作 Android 9 或更高版本的受支援裝置賦予您使用 Android Protected Confirmation 的能力。 使用該工作流時,您的應用會向使用者顯示提示,請他們準許一個簡短的聲明。 應用可以通過這個聲明再次确認,使用者确實想完成一項敏感事務,例如付款。

如果使用者接受該聲明,Android 密鑰庫會收到并存儲由密鑰哈希消息身份驗證代碼 (HMAC) 保護的加密簽名。 Android 密鑰庫确認消息的有效性之後,您的應用可以使用在可信執行環境 (TEE) 下通過 trustedConfirmationRequired 生成的密鑰來簽署使用者已接受的消息。 該簽名具有很高的可信度,它表示使用者已看過聲明并同意其内容。

注意:Android Protected Confirmation 不會為使用者提供安全資訊通道。 應用無法承擔 Android 平台所提供機密性保證之外的任何其他保證。 尤其是,請勿使用該工作流顯示您通常不會顯示在使用者裝置上的敏感資訊。

統一生物識别對話框

在 Android 9 中,系統代表您的應用提供生物識别身份驗證對話框。 該功能可建立标準化的對話框外觀、風格和位置,讓使用者更加确信,他們在使用可信的生物識别憑據檢查程式進行身份驗證。

如果您的應用使用 FingerprintManager 向使用者顯示指紋身份驗證對話框,請切換到改用 BiometricPrompt。 BiometricPrompt 依賴系統來顯示身份驗證對話框。 它還會改變其行為,以适應使用者所選擇的生物識别身份驗證類型。

注:在應用中使用 BiometricPrompt 之前,應該先使用 hasSystemFeature()函數以確定裝置支援 FEATURE_FINGERPRINT、FEATURE_IRIS 或 FEATURE_FACE。

如果裝置不支援生物識别身份驗證,可以回退為使用 createConfirmDeviceCredentialIntent() 函數驗證使用者的 PIN 碼、圖案或密碼。

硬體安全性子產品

運作 Android 9 或更高版本的受支援裝置可擁有 StrongBox Keymaster,它是位于硬體安全性子產品中的 Keymaster HAL 的一種實作。 該子產品包含以下組成部分:

  • 自己的 CPU。
  • 安全存儲空間。
  • 真實随機數生成器。
  • 可抵禦軟體包篡改和未經授權線刷應用的附加機制。

檢查存儲在 StrongBox Keymaster 中的密鑰時,系統會通過可信執行環境 (TEE) 證明密鑰的完整性。

保護對密鑰庫進行的密鑰導入

Android 9 通過利用 ASN.1‑編碼密鑰格式将已加密密鑰安全導入密鑰庫的功能,提高了密鑰解密的安全性。 Keymaster 随後會在密鑰庫中将密鑰解密,是以密鑰的内容永遠不會以明文形式出現在裝置的主機記憶體中。

注:隻有附帶 Keymaster 4 或更高版本的裝置才支援該功能。

具有密鑰輪轉的 APK 簽名方案

Android 9 新增了對 APK Signature Scheme v3 的支援。該架構提供的選擇可以在其簽名塊中為每個簽名證書加入一條輪轉證據記錄。 利用此功能,應用可以通過将 APK 檔案過去的簽名證書連結到現在簽署應用時使用的證書,進而使用新簽名證書來簽署應用。

注:運作 Android 8.1(API 級别 27)或更低版本的裝置不支援更改簽名證書。 如果應用的 minSdkVersion 為 27 或更低,除了新簽名之外,可使用舊簽名證書來簽署應用。

隻允許在未鎖定裝置上進行密鑰解密

Android 9 引入了 unlockedDeviceRequired 标志。 此選項确定在允許使用指定密鑰對任何正在傳輸或存儲的資料進行解密之前,密鑰庫是否要求螢幕解鎖。 這些類型的密鑰非常适合用于加密要存儲在磁盤上的敏感資料,例如健康或企業資料。 該标志為使用者提供了更高的保證,即使手機丢失或被盜,在裝置鎖定的情況下,無法對資料進行解密。

注:unlockedDeviceRequired 标志啟用之後,仍然可以随時進行加密和簽名驗證。 該标志可防止在裝置解鎖時“僅解密”資料。

在裝置鎖定時要確定密鑰安全不被解密,可通過将 true 傳遞給 setUnlockedDeviceRequired() 函數啟用該标志。 完成該步驟之後,當使用者的螢幕被鎖定時,使用該密鑰進行解密或簽署資料的任何嘗試都會失敗。 鎖定裝置在可以通路之前,需要 PIN 碼、密碼、指紋或者一些其他可信因素。

舊版加密支援

附帶 Keymaster 4 的 Android 9 裝置支援三重資料加密算法(簡稱三重 DES)。 如果您的應用與需要三重 DES 的舊版系統進行互操作,請使用這種加密來加密敏感憑據。

Android 備份

Android 9 新增了與備份和還原有關的功能和開發者選項。 這些更改的詳細資訊如以部分下所示。

用戶端加密備份

Android 9 新增了對使用用戶端密鑰加密 Android 備份的支援。 滿足下列條件時會自動啟用該支援功能:

  • 使用者已使用 Android 9 或更高版本啟用備份。
  • 使用者已為其裝置設定螢幕鎖定,需要 PIN 碼、圖案或密碼才能解鎖。

該隐私措施啟用之後,從使用者裝置制作的備份還原資料時,會要求提供裝置的 PIN 碼、圖案或密碼。

定義備份所需的裝置條件

如果您的應用資料包含敏感資訊或偏好,Android 9 可讓您定義裝置條件(例如在用戶端加密已啟用或者正在進行本地裝置到裝置傳輸時),資料将依據該條件包括在使用者的備份中。

無障礙功能

Android 9 引入了針對無障礙功能架構的增強功能,讓您能夠更輕松地為應用的使用者提供更好的體驗。

導航語義

Android 9 中的新增屬性讓您可以更輕松地定義無障礙服務(尤其是螢幕閱讀器)如何從螢幕的某個部分導航到另一個部分。 這些屬性可幫助視力受損使用者在應用界面的文本之間快速移動,并允許他們進行選擇。

例如,在購物應用中,螢幕閱讀器可以幫助使用者從某個交易類别直接導航至下一個交易類别,在轉到下一個類别之前,螢幕閱讀器無需讀取目前類别中的所有交易。

無障礙功能窗格标題

在 Android 8.1(API 級别 27)和更低版本中,無障礙服務有時無法确定螢幕的某個窗格是何時更新的,例如某個 Activity 将一個 Fragment 替換為另一個 Fragment 的時候。 窗格由按照邏輯關系分組、視覺上相關的界面元素組成,其中通常包含一個 Fragment。

在 Android 9 中,可為這些窗格提供 無障礙功能窗格标題,即可單獨識别的标題。 如果某個窗格具有無障礙功能窗格标題,當窗格改變時,無障礙服務可接收更詳細的資訊。 依靠這種功能,服務可以為使用者提供有關界面變化的更精細資訊。

要指定某個窗格的标題,請使用 android:accessibilityPaneTitle 屬性。 您也可以更新在運作時使用 setAccessibilityPaneTitle() 替換的某個界面窗格的标題。 例如,您可以為某個 Fragment 對象的内容區域提供标題。

基于标題的導航

如果您的應用顯示的文本内容包含邏輯标題,則對于表示這些标題的 View 執行個體,請将 android:accessibilityHeading 屬性設定為 true。 通過添加這些标題,無障礙服務可幫助使用者直接從一個标題導航至下一個标題。 任何無障礙服務都可以使用這種功能,以改善使用者界面的導航體驗。

群組導航和輸出

傳統上,螢幕閱讀器一直使用 android:focusable 屬性來确定何時應該将 ViewGroup 或一系列 View 對象作為一個整體進行讀取。 這樣,使用者就可以了解,這些視圖在邏輯上彼此相關。

在 Android 8.1 和更低版本中,您需要将 ViewGroup 中的每個 View 對象标記為不可聚焦,并将 ViewGroup 本身标記為可聚焦。 這種安排導緻 View 的某些執行個體被标記為可聚焦,進而使得鍵盤導航變得更為繁瑣。

從 Android 9 開始,如果将 View 對象标記為可聚焦會産生不良後果,則可以使用 android:screenReaderFocusable 屬性代替 android:focusable 屬性。 螢幕閱讀器聚焦在所有将 android:screenReaderFocusable 或 android:focusable 設定為 true 的元素上。

便捷操作

Android 9 新增了一些友善使用者執行操作的支援功能:

通路提示: 無障礙功能架構中的新增功能可讓您在應用界面中通路提示。 使用 getTooltipText() 讀取提示文本,使用

ACTION_SHOW_TOOLTIP 和 ACTION_HIDE_TOOLTIP 來訓示 View 的執行個體顯示或隐藏提示。

新增全局操作: Android 9 在 AccessibilityService 類中引入了對兩個額外裝置操作的支援。 您的 Service 可以幫助使用者分别使用 GLOBAL_ACTION_LOCK_SCREEN 和 GLOBAL_ACTION_TAKE_SCREENSHOT 操作鎖定其裝置并進行螢幕截圖。

視窗變更詳情

Android 9 讓您可以在應用同時重繪多個視窗時,更輕松地跟蹤應用視窗的更新。 當發生 TYPE_WINDOWS_CHANGED 事件時,可使用 getWindowChanges() API 來确定視窗發生的變更。 在多視窗更新期間,每個視窗都會生成自己的一組事件。 getSource() 函數傳回與每個事件相關聯的視窗的根視圖。

如果應用已為其 View 對象定義無障礙功能窗格标題,您的 Service 将可以識别應用界面何時進行更新。 TYPE_WINDOW_STATE_CHANGED 事件發生時,可使用 getContentChangeTypes() 所傳回的類型來确定視窗發生的變更。 例如,架構可以檢測窗格何時有新标題或者窗格何時消失。

旋轉

為避免無意的旋轉,我們新增了一種模式,哪怕裝置位置發生變化,也會固定在目前螢幕方向上。 必要時使用者可以通過按系統欄上的一個按鈕手動觸發旋轉。

大多數情況下,對應用的相容性影響微不足道。 不過,如果您的應用有任何自定義旋轉行為,或使用了任何非正常的螢幕方向設定,則可能會遇到以前使用者旋轉首選項始終設定為縱向時被忽視的問題。 我們鼓勵您審視一下您的應用所有關鍵 Activity 中的旋轉行為,并確定您的所有螢幕方向設定仍可提供最佳體驗。

一個新的旋轉模式允許使用者在必要時利用系統欄上的一個按鈕手動觸發旋轉。

文本

Android 9 為平台提供了以下與文本相關的功能:

  • 文本預先計算:PrecomputedText 類使您能提前計算和緩存所需資訊,改善了文本渲染性能。它還使您的應用可以在主線程之外執行文本布局。
  • 放大器:Magnifier 類是一種可提供放大器 API 的微件,可在所有應用中實作一緻的放大器功能體驗。
  • Smart Linkify:Android 9 增強了 TextClassifier類,該類可利用機器學習在標明文本中識别一些實體并建議采取相應的操作。 例如,TextClassifier可以讓您的應用檢測到使用者選擇了電話号碼。 然後,您的應用可以建議使用者使用該号碼撥打電話。 TextClassifier 中的功能取代了Linkify 類的功能。
  • 文本布局:借助幾種便捷函數和屬性,可以更輕松地實作界面設計。

DEX 檔案的 ART 提前轉換

在運作 Android 9 或更高版本的裝置上,Android 運作時 (ART) 提前編譯器通過将應用軟體包中的 DEX 檔案轉換為更緊湊的表示形式,進一步優化了壓縮的 Dalvik Executable 格式 (DEX) 檔案。 此項變更可讓您的應用啟動更快并消耗更少的磁盤空間和記憶體。

這種改進特别有利于磁盤 I/O 速度較慢的低端裝置。

裝置端系統跟蹤