Android 9 (API 級別 28) 為使用者和開發人員推出了強大的新功能。本文件特別介紹開發人員適用的新功能。
如要瞭解新版 API,請參閱 API 差異比較報表或參閱 Android API 參考資料。此外,請務必參閱 Android 9 行為變更一文,瞭解平台異動可能會影響您的應用程式有哪些部分。
透過 Wi-Fi RTT 設計室內定位

Android 9 加入了 IEEE 802.11-2016 Wi-Fi 通訊協定 (又稱為 Wi-Fi 封包往返時間 (RTT) 的平台支援,可讓您在應用程式中利用室內定位。
在搭載 Android 9 的硬體支援裝置上,應用程式可以使用 RTT API 測量與附近支援 RTT 的 Wi-Fi 存取點 (AP) 的距離。裝置必須啟用定位服務和開啟 Wi-Fi 掃描功能 (在「設定」>「位置」下方),應用程式必須具備 ACCESS_FINE_LOCATION
權限。裝置不必連線至存取點,就能使用即時文字訊息。
為維護隱私,只有手機能夠判斷與存取點的距離,因此存取點不會提供這項資訊。
如果裝置測量到與 3 個以上的存取點之間的距離,您可以使用係數演算法來估算最適合這些測量點的裝置位置。一般在 1 到 2 公尺以內即可得到精確的結果。
透過這種精確性,您可以建構新的體驗,例如建築物內建導航和精細的位置服務,例如模糊的語音控制功能 (例如「開燈」),以及位置資訊 (例如「這項產品有特別優惠嗎?」)。
在 Android WifiRttScan 示範應用程式中,查看使用中的 Wi-Fi RTT API。
詳情請參閱 Wi-Fi 位置:使用 RTT 的範圍。
支援螢幕凹口

使用模擬器測試螢幕凹口
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 withCutout」。
- 選取凹口大小。
通知
Android 9 導入了幾項通知功能的強化功能,這些功能都可供指定 API 級別 28 以上的開發人員使用。

MessagingStyle 附有相片。

MessagingStyle 包括回覆和對話。
如需使用通知的程式碼範例 (包括 Android 9 功能),請參閱「人物範例」。
進階訊息體驗
從 Android 7.0 (API 等級 24) 開始,您可以新增動作讓使用者回覆訊息,或是直接在通知中輸入其他文字。Android 9 新增了以下強化項目,強化這項功能:
簡化對對話參與者的支援:
Person
類別可用來識別對話參與者,包括顯示圖片和 URI。其他許多 API (例如addMessage()
) 現在會使用Person
類別,而非CharSequence
。Person
類別也支援建構工具設計模式。支援圖片:Android 9 現在可在手機上的訊息通知中顯示圖片。您可以在訊息中使用
setData()
以顯示圖片。下列程式碼片段示範如何建立Person
和包含圖片的訊息。
Kotlin
// Create new Person. val sender = Person() .setName(name) .setUri(uri) .setIcon(null) .build() // Create image message. val message = Message("Picture", time, sender) .setData("image/", imageUri) val style = Notification.MessagingStyle(getUser()) .addMessage("Check this out!", 0, sender) .addMessage(message)
Java
// 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);
將回覆儲存為草稿:應用程式可在使用者不小心關閉訊息通知時,擷取系統傳送的
EXTRA_REMOTE_INPUT_DRAFT
。您可以使用這項額外項目在應用程式中預先填入文字欄位,讓使用者完成回覆。識別對話是否為群組對話:您可以使用
setGroupConversation()
刻意將對話識別為群組或非群組對話。為意圖設定語意動作:
setSemanticAction()
方法可讓您為動作提供語意含義,例如「標示為已讀取」、「刪除」、「回覆」等等。SmartReply:Android 9 支援和訊息應用程式中相同的建議回覆。使用
RemoteInput.setChoices()
向使用者提供一系列的標準回應。
頻道設定、廣播和零打擾模式
Android 8.0 推出了通知管道,可讓您為要顯示的每種通知類型,建立使用者可自訂的管道。Android 9 以下列方式簡化了通知設定管道設定:
封鎖管道群組:使用者現在可以在應用程式的通知設定中封鎖整個管道。您可以使用
isBlocked()
方法,辨識群組何時遭到封鎖,因此不會向該群組中的頻道傳送任何通知。此外,應用程式可以使用新的
getNotificationChannelGroup()
方法查詢目前的管道群組設定。新的廣播意圖類型:現在當通知管道和管道群組的封鎖狀態有所變更時,Android 系統會傳送廣播意圖。擁有遭封鎖管道或群組的應用程式可以監聽這些意圖,並據此做出回應。如要進一步瞭解這些意圖動作和額外內容,請參閱
NotificationManager
參考資料中更新後的常數清單。如要瞭解如何回應廣播意圖,請參閱廣播。NotificationManager.Policy
有三個新的「零打擾」優先順序類別:PRIORITY_CATEGORY_ALARMS
會優先顯示鬧鐘,PRIORITY_CATEGORY_MEDIA
會優先顯示媒體來源 (例如媒體和語音導航) 的音效。PRIORITY_CATEGORY_SYSTEM
會優先處理系統音效。
NotificationManager.Policy
還提供七種新的「零打擾」模式常數,可用於隱藏視覺幹擾:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
會防止通知啟動全螢幕活動。SUPPRESSED_EFFECT_LIGHTS
會封鎖通知指示燈。SUPPRESSED_EFFECT_PEEK
可避免通知短暫滑入檢視畫面 (「迅速瀏覽」)。SUPPRESSED_EFFECT_STATUS_BAR
會防止通知顯示在支援狀態列的裝置上狀態列。SUPPRESSED_EFFECT_BADGE
會在支援標記的裝置上封鎖徽章。詳情請參閱修改通知標記。SUPPRESSED_EFFECT_AMBIENT
會在支援微光螢幕的裝置上封鎖通知。SUPPRESSED_EFFECT_NOTIFICATION_LIST
會防止通知顯示在支援清單檢視的裝置上,例如通知欄或螢幕鎖定畫面。
多鏡頭支援和攝影機更新
在搭載 Android 9 的裝置上,您可以透過兩部以上的實體相機同時存取串流。您可以在具有雙前置或雙後置鏡頭的裝置上,建立單部相機無法實現的創新功能,例如順暢的縮放、散景和立體視覺。這個 API 也可讓您呼叫邏輯或整合式相機串流,自動在兩個以上的相機之間切換。
相機的其他改善項目包括額外的工作階段參數,可協助降低初始擷取期間的延遲,以及可讓相機用戶端處理各種用途的途徑,而無須停止及啟動相機串流。我們還新增了 API,以便顯示以顯示為基礎的閃光燈支援,以及存取 OIS 時間戳記,以便應用程式層級圖像穩定技術和特效。
在 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
物件來建立 Drawable
或 Bitmap
,藉此呼叫 decodeDrawable()
或 decodeBitmap()
。如要變更預設設定,請將 OnHeaderDecodedListener
傳遞至 decodeDrawable()
或 decodeBitmap()
。ImageDecoder
會在已知時呼叫 onHeaderDecoded()
,並使用圖片的預設寬度和高度。如果編碼圖片是動畫 GIF 或 WebP,decodeDrawable()
會傳回 Drawable
,也就是 AnimatedImageDrawable
類別的執行個體。
設定圖片屬性的方法有很多種:
- 如要將已解碼的圖片縮放為確切大小,請將目標尺寸傳遞至
setTargetSize()
。您也可以使用樣本大小調整圖片。將樣本大小直接傳遞至setTargetSampleSize()
。 - 如要裁剪縮放後圖片範圍內的圖片,請呼叫
setCrop()
。 - 如要建立可變動的點陣圖,請將
true
傳遞至setMutableRequired()
。
ImageDecoder
也可讓您為圖片新增複雜的自訂效果,例如圓角或圓形遮罩。將 setPostProcessor()
與 PostProcessor
類別的執行個體搭配使用,即可執行您需要的任何繪圖指令。
動畫
Android 9 推出了 AnimatedImageDrawable
類別,用於繪製及顯示 GIF 和 WebP 動畫圖片。AnimatedImageDrawable
的運作方式與 AnimatedVectorDrawable
類似,轉譯執行緒會驅動 AnimatedImageDrawable
的動畫。轉譯執行緒也會使用工作站執行緒進行解碼,因此解碼作業不會與轉譯執行緒的其他作業幹擾。這項實作可讓應用程式顯示動畫圖片,無需管理更新,或乾擾應用程式 UI 執行緒上的其他事件。
AnimatedImageDrawable
可使用 ImageDecoder
的執行個體解碼。下列程式碼片段說明如何使用 ImageDecoder
解碼 AnimatedImageDrawable
:
Kotlin
@Throws(IOException::class) private fun decodeImage() { val decodedAnimation = ImageDecoder.decodeDrawable( ImageDecoder.createSource(resources, R.drawable.my_drawable)) // Prior to start(), the first frame is displayed. (decodedAnimation as? AnimatedImageDrawable)?.start() }
Java
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. ((AnimatedImageDrawable) decodedAnimation).start(); } }
ImageDecoder
有多個方法可讓您進一步修改圖片。舉例來說,您可以使用 setPostProcessor()
方法修改圖片外觀,例如套用圓形遮罩或圓角。
HDR VP9 影片、HEIF 圖片壓縮和媒體 API
Android 9 內建高動態範圍 (HDR) VP9 Profile 2 的支援,因此您可以在支援 HDR 的裝置上,透過 YouTube、Play 電影和其他來源向使用者放送支援 HDR 的電影。
Android 9 也開始支援使用高效率圖片檔案格式 (HEIF 或 HEIC) 對圖片進行編碼,這可改善壓縮效果並減少儲存空間和網路數據用量。MediaMuxer
和 MediaExtractor
類別支援 HEIF 靜態圖片範例。由於 Android 9 裝置的平台支援,您可以從後端伺服器輕鬆傳送和使用 HEIF 圖片。確認應用程式與這個資料格式相容後,即可分享及顯示。您可以試試 HEIF 做為應用程式中的圖片儲存格式。您可以使用 ImageDecoder
或 BitmapFactory
(從 JPEG 檔案取得點陣圖) 進行 jpeg 對心轉換。接著,您可以使用 HeifWriter
從 YUV 位元組緩衝區寫入 HEIF 靜態圖片,或是 Surface
或 Bitmap
的執行個體。
媒體指標也能從 AudioTrack
、AudioRecord
和 MediaDrm
類別中使用。
Android 9 引入 MediaDRM
類別的方法,用於取得指標、HDCP 等級、安全等級和工作階段數,並能進一步控管安全等級和安全停止。詳情請參閱 API 差異報表。
在 Android 9 中,AAudio API 新增了多種 AAudioStream 屬性的支援,包括使用方式、內容類型和輸入預設值。您可以使用這些屬性,針對 VoIP 或攝錄影機應用程式建立微調的串流。您也可以設定工作階段 ID,將 AAudio 串流與可包含特效的子混音建立關聯。請使用 AudioEffect
API 控管相關效果。
Android 9 推出了 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_TENSOR_QUANT8_ASYMM
張量傳遞至 ANEURALNETWORKS_PAD
運算 (適用於 Android 9 以上版本) 時,NNAPI 的輸出內容可能與進階機器學習架構 (例如 TensorFlow Lite) 的輸出內容不相符。您應改為僅傳遞
ANEURALNETWORKS_TENSOR_FLOAT32
,直到問題解決為止。
此外,這個 API 還導入了 ANeuralNetworksModel_relaxComputationFloat32toFloat16()
這個新函式,可讓您指定是否要計算 ANEURALNETWORKS_TENSOR_FLOAT32
的範圍和精確度,是否與 IEEE 754 16 位元浮點格式一樣低。
自動填入架構
Android 9 導入了多項改善功能,自動填入服務可進一步改善填寫表單時的使用者體驗。如要進一步瞭解如何在應用程式中使用自動填入功能,請參閱「自動填入架構」指南。
安全性增強項目
Android 9 推出了幾項安全性功能,請參閱以下各節摘要:
Android 保護確認
支援搭載 Android 9 以上版本的裝置可讓您使用 Android 保護確認。使用這項工作流程時,您的應用程式會顯示提示,要求使用者核准簡短聲明。這個陳述式可讓應用程式重新確認使用者要完成敏感交易 (例如付款)。
如果使用者接受陳述式,Android KeyStore 會收到並儲存受金鑰雜湊訊息驗證碼 (HMAC) 保護的加密編譯簽名。Android KeyStore 確認訊息有效之後,應用程式就可以使用在受信任執行環境 (TEE) 中 trustedConfirmationRequired
產生的金鑰,簽署使用者接受的訊息。簽章表示使用者已看過且同意此聲明,可信度極高。
注意: Android 保護確認不會為使用者提供安全資訊管道。除了 Android 平台提供的保密保證外,您的應用程式不得假設其提供任何保密保證。請特別注意,請勿使用這項工作流程來顯示通常不會出現在使用者裝置上的機密資訊。
如需新增對 Android 保護確認的支援指引,請參閱「Android 保護確認」指南。
統合生物特徵辨識驗證對話方塊
在 Android 9 中,系統會代表應用程式提供生物特徵辨識驗證對話方塊。這項功能可以為對話方塊建立標準化外觀、風格和位置,讓使用者更放心地透過可信任的生物特徵辨識憑證檢查工具進行驗證。
如果您的應用程式使用 FingerprintManager
向使用者顯示指紋驗證對話方塊,請改用 BiometricPrompt
。BiometricPrompt
需要系統顯示驗證對話方塊。也會依據使用者選擇的生物特徵辨識驗證類型調整行為。
硬體安全性模組
搭載 Android 9 以上版本的支援裝置可能會具有 StrongBox Keymaster,這是硬體安全性模組中的 Keymaster HAL 實作。模組包含以下內容:
- 而且具備專屬 CPU
- 安全儲存空間
- 真正的隨機號碼產生器。
- 其他防止套件竄改和未經授權應用程式側載的其他機制。
檢查儲存在 StrongBox Keymaster 中的金鑰時,系統會將金鑰的完整性與受信任的執行環境 (TEE) 建立關聯。
如要進一步瞭解如何使用 Strongbox Keymaster,請參閱硬體安全性模組。
將安全金鑰匯入 KeyStore
Android 9 使用 ASN.1 編碼金鑰格式,新增將加密金鑰安全地匯入 KeyStore 的功能,藉此提供額外的金鑰解密安全防護。接著,Keymaster 會解密 KeyStore 中的金鑰,這樣在裝置主機記憶體中,金鑰內容就不會顯示為明文。
進一步瞭解如何更安全地匯入加密金鑰。
採用金鑰輪替的 APK 簽名配置
Android 9 新增對 APK Signature Scheme v3 的支援。此配置可以選擇在每個簽署憑證的簽署區塊中,加入輪替證明記錄。這項功能可將 APK 檔案的過去簽署憑證連結至現已簽署的 APK 檔案,進而讓應用程式使用新的簽署憑證簽署。
進一步瞭解如何使用 apksigner
輪替金鑰。
僅允許在已解鎖裝置上解密金鑰的選項
Android 9 推出了 unlockedDeviceRequired
旗標。這個選項會決定 KeyStore 是否需要解鎖螢幕,才能使用指定金鑰對任何傳輸中資料或已儲存的資料進行解密。這類金鑰非常適合用於加密要儲存在磁碟上的機密資料,例如健康或企業資料。這個標記可以在裝置鎖定時確保資料無法在手機遺失或遭竊時解密。
為了確保金鑰無法在裝置鎖定時進行解密,請將 true
傳遞至 setUnlockedDeviceRequired()
方法,以啟用這個標記。完成這個步驟後,當使用者的螢幕遭鎖定時,任何嘗試使用這組金鑰解密或簽署資料的作業都會失敗。鎖定的裝置必須設定 PIN 碼、密碼、指紋或其他可信任的因素,才能存取。
舊版加密支援
搭載 Keymaster 4 的 Android 9 裝置,支援三重資料加密演算法 (即 Triple DES)。如果您的應用程式與需要三點 DES 的舊版系統互通,請在加密機密憑證時使用這種加密方式。
如要進一步瞭解如何提升應用程式的安全性,請參閱「Android 開發人員的安全性」。
淘汰 WPS
基於安全考量,Wi-Fi 保護設定 (WPS) 已淘汰。
Android 備份資料
Android 9 新增備份與還原相關新功能和開發人員選項。以下各節將提供這些異動的詳細資料。
用戶端加密備份
Android 9 開始支援使用用戶端密鑰為 Android 備份加密。符合下列條件時,系統就會自動啟用這項支援功能:
- 使用者已在 Android 9 以上版本 啟用備份功能。
- 使用者已為裝置設定螢幕鎖定,要求使用者必須輸入 PIN 碼、解鎖圖案或密碼才能解鎖。
啟用這項隱私權措施後,如要從使用者裝置備份的資料還原資料,就必須輸入裝置的 PIN 碼、解鎖圖案或密碼。如要進一步瞭解這項功能所採用的技術,請參閱 Google Cloud Key Vault 服務白皮書。
定義備份所需的裝置條件
如果應用程式資料包含機密資訊或偏好設定,Android 9 可讓您定義裝置條件,用於定義會在使用者備份中包含的應用程式資料,例如啟用用戶端加密或本機裝置之間的傳輸作業。
想進一步瞭解如何在 Android 裝置上備份資料,請參閱「資料備份總覽」。
無障礙功能
Android 9 改進了無障礙架構,方便您為應用程式使用者提供更優質的體驗。
Navigation 語意
Android 9 中新增的屬性可讓您更輕鬆地定義無障礙服務 (尤其是螢幕閱讀器) 如何從畫面的特定部分導覽至另一個部分。這些屬性可協助視障使用者快速瀏覽應用程式 UI 中的文字,並讓他們做出選擇。
舉例來說,在購物應用程式中,螢幕閱讀器可協助使用者直接從某一種交易類別前往下一個類別,而螢幕閱讀器不需要在繼續閱讀下一個類別前,需要先閱讀該類別中的所有項目。
無障礙窗格標題
在 Android 8.1 (API 級別 27) 以下版本中,無障礙服務不一定能判斷何時更新畫面的特定窗格,例如活動將某個片段取代為另一個片段時。窗格包含依邏輯分組且與視覺相關的 UI 元素,通常包含一個片段。
在 Android 9 中,您可以為這些窗格提供無障礙窗格標題,或個別識別的標題。如果窗格有無障礙窗格標題,無障礙服務會在窗格變更時收到更詳細的資訊。這項功能可讓服務為使用者提供更精細的 UI 異動資訊。
如要指定窗格的標題,請使用 android:accessibilityPaneTitle
屬性。您也可以使用 setAccessibilityPaneTitle()
,更新在執行階段取代的 UI 窗格標題。舉例來說,您可以提供 Fragment
物件內容區域的標題。
以標題為基礎的導覽
如果應用程式會顯示包含邏輯標題的文字內容,請針對代表這些標題的 View
例項,將 android:accessibilityHeading
屬性設為 true
。加入這些標題,即代表您允許無障礙服務協助使用者從某個標題直接瀏覽到下一個標題。任何無障礙服務都能使用此功能來改善使用者的 UI 導覽體驗。
群組導覽和輸出內容
螢幕閱讀器傳統上會使用 android:focusable
屬性,判斷何時應以單一單元的形式讀取 ViewGroup
或一組 View
物件。如此一來,使用者就能瞭解檢視畫面彼此的邏輯關聯。
在 Android 8.1 以下版本中,您必須將 ViewGroup
中的每個 View
物件標示為不可聚焦,而 ViewGroup
本身應為可聚焦。這個排列方式造成部分 View
例項標示為可聚焦,使得鍵盤瀏覽作業更加繁瑣。
自 Android 9 起,您可以使用 android:screenReaderFocusable
屬性取代 android:focusable
屬性,如果將 View
物件設為可聚焦,會導致無法預期結果。螢幕閱讀器的焦點位於已將 android:screenReaderFocusable
或 android:focusable
設為 true
的所有元素。
便利動作
Android 9 新增可代表使用者執行便利操作的支援功能:
- 與工具提示的互動
- 在無障礙架構中新增功能,可讓您存取應用程式 UI 中的工具提示。請使用
getTooltipText()
讀取工具提示的文字,並使用ACTION_SHOW_TOOLTIP
和ACTION_HIDE_TOOLTIP
來指示View
的執行個體來顯示或隱藏工具提示。 - 已新增全域動作
- Android 9 支援
AccessibilityService
類別中的其他兩項裝置動作。您的服務可以分別運用GLOBAL_ACTION_LOCK_SCREEN
和GLOBAL_ACTION_TAKE_SCREENSHOT
動作,協助使用者鎖定裝置及擷取螢幕畫面。
視窗變更詳細資訊
當應用程式同時重新繪製多個視窗時,Android 9 可讓您更輕鬆地追蹤應用程式視窗的更新。發生 TYPE_WINDOWS_CHANGED
事件時,請使用 getWindowChanges()
API 來判斷視窗的變化情形。在多視窗更新期間,每個視窗都會產生一組專屬的事件。getSource()
方法會傳回與每個事件相關聯的視窗根層級檢視畫面。
如果應用程式已為 View
物件定義無障礙窗格標題,則您的服務可以辨識應用程式的使用者介面更新。發生 TYPE_WINDOW_STATE_CHANGED
事件時,請使用 getContentChangeTypes()
傳回的類型來判斷視窗的變化情形。舉例來說,架構可以偵測到窗格有新標題或窗格消失的時間。
旋轉
為避免意外旋轉,我們新增了可固定目前方向的模式,即使裝置位置改變也一樣。使用者可視需要按下系統列中的按鈕,手動觸發旋轉功能。
在大多數情況下,應用程式對相容性的影響不大。不過,如果應用程式有任何自訂旋轉行為,或使用任何不尋常的螢幕方向設定,您可能會遇到使用者先前一律將旋轉偏好設定設為直向時未註意到的問題。建議您查看應用程式所有重要活動的旋轉行為,確保所有螢幕方向設定都能提供最佳體驗。
詳情請參閱相關的行為變更。

全新的旋轉模式可讓使用者在需要時,使用系統列中的按鈕手動觸發旋轉功能。
Text
Android 9 為平台提供下列文字相關功能:
預先計算的文字:
PrecomputedText
類別可讓您事先運算並快取必要資訊,以改善文字轉譯效能。還能讓應用程式在主執行緒外執行文字版面配置。放大鏡:
Magnifier
類別是提供放大鏡 API 的平台小工具,可讓所有應用程式提供一致的放大鏡功能體驗。Smart Linkify:Android 9 強化
TextClassifier
類別,利用機器學習技術識別所選文字中的部分實體及建議動作。舉例來說,TextClassifier
可讓應用程式偵測使用者是否已選取電話號碼。您的應用程式接著會建議使用者使用該號碼撥打電話。TextClassifier
中的功能會取代Linkify
類別的功能。文字版面配置:多種便利的方法和屬性可讓您更輕鬆地實作 UI 設計。詳情請參閱
TextView
的參考說明文件。
DEX 檔案的預先轉換 ART
在搭載 Android 9 以上版本的裝置上,Android 執行階段 (ART) 預先編譯器會將應用程式套件中的 DEX 檔案轉換為更精簡的表示法,進一步最佳化經過壓縮的 Dalvik 執行格式 (DEX) 檔案。這項變更可讓應用程式啟動速度更快,並消耗較少的磁碟空間和 RAM。
這項改善特別適合磁碟 I/O 速度較慢的低階裝置。
裝置端系統追蹤
您可以透過 Android 9 錄製裝置上的系統追蹤記錄,然後將這些錄音的報表分享給開發團隊。這份報表支援多種格式,包括 HTML。
透過收集這些追蹤記錄,您可以擷取與應用程式程序和執行緒相關的時間資料,並查看其他類型的全球重要裝置狀態。
如要進一步瞭解這項工具,請參閱「執行裝置端系統追蹤功能」。