Android 11 為開發人員推出了強大的新功能和 API。以下各節可協助您瞭解應用程式功能,並開始使用相關的 API。
如需新增、修改及移除 API 的詳細清單,請參閱 API 差異比較表。如要進一步瞭解新的 API,請參閱 Android API 參考資料 - 新的 API 會醒目顯示,以利於查看。此外,如要瞭解平台變更可能對應用程式造成的影響,請務必查看指定 Android R 的應用程式和所有應用程式的 Android 11 行為變更,以及隱私權變更。
全新體驗
裝置控制項
Android 11 包含新的 ControlsProviderService API,可用於公開已連線外部裝置的控制項。這些控制項會顯示在 Android 電源鍵選單的「裝置控制」下方。詳情請參閱「控制外部裝置」。
媒體控制
Android 11 更新了媒體控制選項的顯示方式。媒體控制選項會顯示在快速設定附近。多個應用程式的工作階段會排列在可滑動的輪播介面中,包括在手機上播放的串流、遠端串流 (例如在外部裝置上偵測到的串流或投放工作階段),以及先前可繼續播放的工作階段 (依上次播放順序排列)。
使用者可以從輪播介面重新啟動先前的工作階段,不必啟動應用程式。開始播放後,使用者就能以一般方式操作媒體控制項。
詳情請參閱媒體控制項。
螢幕
更妥善支援瀑布式螢幕
Android 11 提供多種 API,支援瀑布式螢幕,也就是環繞裝置邊緣的螢幕。這類螢幕會視為螢幕凹口的變種。現有的 DisplayCutout.getSafeInset…() 方法現在會傳回安全插邊,以避開瀑布區域和凹口。如要在瀑布區域中算繪應用程式內容,請執行下列操作:
呼叫
DisplayCutout.getWaterfallInsets()取得瀑布流插邊的確切尺寸。將視窗版面配置屬性
layoutInDisplayCutoutMode設為LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,讓視窗可延伸至螢幕所有邊緣的凹口和瀑布區域。請務必確保重要內容不會位於凹口或瀑布式區域。
轉軸角度感應器和折疊式裝置
Android 11 推出新的感應器 TYPE_HINGE_ANGLE 和 SensorEvent,可監控轉軸角度,並提供裝置兩個整數部分之間的角度測量值 (以度為單位),讓在轉軸式螢幕設定裝置上執行的應用程式判斷轉軸角度。使用者操作裝置時,您可以使用這些原始測量值執行精細的動畫。
請參閱「摺疊式裝置」。
對話
對話改善
Android 11 改善了對話的處理方式,對話是兩位以上使用者之間的即時雙向通訊。這些對話會特別醒目顯示,使用者也能透過多種新方式與其互動。
如要進一步瞭解對話和應用程式支援方式,請參閱「使用者和對話」。
即時通訊泡泡
開發人員現在可以使用對話框,在系統中顯示對話。對話框是 Android 10 的實驗功能,必須透過開發人員選項啟用;Android 11 則不需要。
如果應用程式指定 Android 11 (API 級別 30) 以上版本,除非通知符合新的對話規定,否則不會以對話框形式顯示。具體來說,通知必須與捷徑建立關聯。
在 Android 11 之前,如要讓通知顯示為泡泡,您必須明確指定通知一律以文件 UI 模式啟動。從 Android 11 開始,您不必再明確設定這項設定;如果通知以泡泡形式顯示,平台會自動將通知設為一律以文件 UI 模式啟動。
泡泡功能在效能方面有許多改善,使用者也能更靈活地為每個應用程式啟用及停用泡泡。對於實作實驗性支援的開發人員,Android 11 的 API 有幾項變更:
- 不含參數的
BubbleMetadata.Builder()建構函式已淘汰,請改用兩個新的建構函式BubbleMetadata.Builder(PendingIntent, Icon)或BubbleMetadata.Builder(String)。 - 呼叫
BubbleMetadata.Builder(String),從捷徑 ID 建立BubbleMetadata。 傳遞的字串應與提供給Notification.Builder的捷徑 ID 相符。 - 使用
Icon.createWithContentUri()或新方法createWithAdaptiveBitmapContentUri()建立泡泡圖示。
5G 視覺指標
如要瞭解如何在使用者裝置上顯示 5G 指標,請參閱「在使用者連上 5G 網路時通知他們」。
隱私權
Android 11 導入了大量變更和限制,可進一步保護使用者隱私。詳情請參閱「隱私權」頁面。
安全性
生物辨識驗證更新
為協助您控管應用程式資料的安全等級,Android 11 針對生物特徵辨識驗證進行了多項改良。這些變更也會顯示在 Jetpack Biometric 程式庫中。
驗證類型
Android 11 推出 BiometricManager.Authenticators 介面,可用於宣告應用程式支援的驗證類型。
判斷使用的驗證類型
使用者完成驗證後,您可以呼叫 getAuthenticationType(),檢查使用者是使用裝置憑證還是生物特徵辨識憑證完成驗證。
進一步支援單次使用驗證金鑰
Android 11 進一步支援使用每次驗證金鑰進行驗證。
已淘汰的方法
Android 11 已淘汰下列方法:
setDeviceCredentialAllowed()方法。setUserAuthenticationValidityDurationSeconds()方法。- 不接受任何引數的
canAuthenticate()超載版本。
安全地共用大型資料集
在某些情況下 (例如機器學習或媒體播放),您的應用程式可能會想使用與其他應用程式相同的大型資料集。在舊版 Android 中,您的應用程式和其他應用程式都必須下載相同資料集的個別副本。
為減少網路和磁碟上的資料備援,Android 11 允許使用共用資料 Blob,在裝置上快取這些大型資料集。如要進一步瞭解如何共用資料集,請參閱共用大型資料集的深入指南。
在 OTA 重新啟動後執行檔案型加密,不需使用者憑證
裝置完成 OTA 更新並重新啟動後,系統會立即提供置於憑證保護儲存空間的憑證加密 (CE) 金鑰,供檔案型加密 (FBE) 作業使用。也就是說,在 OTA 更新後,您的應用程式可以在使用者輸入 PIN 碼、解鎖圖案或密碼之前,繼續執行需要 CE 金鑰的作業。
成效和品質
無線偵錯
Android 11 支援使用 Android Debug Bridge (adb),從工作站以無線方式部署應用程式並進行偵錯。舉例來說,您可以將可進行偵錯的應用程式部署至多部遠端裝置,不僅不必實際透過 USB 連接裝置,也不用處理常見的 USB 連線問題 (例如安裝驅動程式)。詳情請參閱「在硬體裝置上執行應用程式」。
透過 ADB 漸進式安裝 APK
即使只對應用程式進行小幅變更,在裝置上安裝大型 (2 GB 以上) APK 也可能需要很長時間。ADB (Android Debug Bridge) 漸進式 APK 安裝作業會安裝足夠的 APK 來啟動應用程式,同時在背景串流播放剩餘資料,藉此加快這個程序。如果裝置支援這項功能,且您已安裝最新版 SDK Platform-Tools,adb install 就會自動使用這項功能。如果系統不支援,則會預設使用無訊息安裝方法。
使用下列 adb 指令即可使用這項功能。如果裝置不支援漸進式安裝,指令會失敗並輸出詳細說明。
adb install --incremental
執行 ADB 增量 APK 安裝作業前,您必須簽署 APK 並建立 APK 簽署配置 v4 檔案。如要使用這項功能,v4 簽署檔案必須放在 APK 旁邊。
使用原生記憶體分配器偵測錯誤
GWP-ASan 是一種原生記憶體配置器功能,可協助找出釋放後使用和堆積緩衝區溢位錯誤。您可以為應用程式的特定子程序或全域啟用這項功能。詳情請參閱 GWP-ASan 指南。
Neural Networks API 1.3
Android 11 擴充並改良了 Neural Networks API (NNAPI)。
新作業
NNAPI 1.3 導入新的運算元型別 TENSOR_QUANT8_ASYMM_SIGNED,支援 TensorFlow Lite 的新量化配置。
此外,NNAPI 1.3 還推出下列新作業:
QUANTIZED_LSTMIFWHILEELUHARD_SWISHFILLRANK
全新機器學習控制選項
NNAPI 1.3 導入了新的控制項,可協助機器學習順暢運作:
QoS API:新的服務品質 API 支援 NNAPI 中的優先順序和工作期限,並提供下列新函式:
記憶體網域輸入/輸出:NNAPI 1.3 支援將記憶體網域做為執行的輸入和輸出。這項功能會移除不同系統元件之間不必要的相同資料副本,進而提升 Android 神經網路的執行階段效能。這項功能新增了一組 NDK API,可搭配
ANeuralNetworksMemoryDesc和ANeuralNetworkMemory物件使用,包括下列函式:ANeuralNetworksMemoryDesc_create()ANeuralNetworksMemoryDesc_free()ANeuralNetworksMemoryDesc_addInputRole()ANeuralNetworksMemoryDesc_addOutputRole()ANeuralNetworksMemoryDesc_setDimensions()ANeuralNetworksMemoryDesc_finish()ANeuralNetworksMemory_createFromDesc()ANeuralNetworksMemory_copy()
詳情請參閱類神經網路記憶體網域範例。
支援依附元件 API 和同步柵欄:NNAPI 1.3 支援具備依附元件的非同步運算,因此在叫用小型鏈結模型時,可大幅減少負擔。這項功能新增了下列函式:
控制流程:NNAPI 1.3 支援一般控制流程,並提供新的圖表運算
ANEURALNETWORKS_IF和ANEURALNETWORKS_WHILE,可使用新的ANEURALNETWORKS_MODEL運算元型別,將其他模型做為引數。此外,這項功能還新增了下列函式:
NDK Thermal API
當裝置過熱時,裝置可能會對 CPU 和/或 GPU 進行節流措施,進而以非預期方式影響應用程式。如果應用程式或遊戲使用複雜的圖形、大量計算或持續的網路活動,就更有可能引發問題。
在 Android 11 中使用 NDK Thermal API 監控裝置的溫度變化,然後採取相應措施,以維持較低的耗電量和裝置溫度。這個 API 與 Java Thermal API 類似,可用於接收任何熱力狀態變更的通知,或直接輪詢目前狀態。
文字和輸入
改善 IME 轉換
Android 11 導入了新 API,可改善輸入法編輯器 (例如螢幕鍵盤) 的轉場效果。這些 API 可讓您更輕鬆地調整應用程式內容,與 IME 的顯示和隱藏狀態,以及狀態列和導覽列等其他元素同步。
如要在任何 EditText 具有焦點時顯示輸入法編輯器,請呼叫 view.getInsetsController().show(Type.ime())。(您可以在與聚焦 EditText 相同的階層中,對任何檢視區塊呼叫這個方法,不一定要對 EditText 呼叫。)如要隱藏 IME,請呼叫 view.getInsetsController().hide(Type.ime())。您可以呼叫 view.getRootWindowInsets().isVisible(Type.ime()),檢查 IME 目前是否顯示。
如要讓應用程式的檢視畫面與 IME 的顯示和隱藏動作同步,請在檢視畫面上設定監聽器,方法是提供 WindowInsetsAnimation.Callback 至 View.setWindowInsetsAnimationCallback()。(您可以在任何檢視區塊上設定這個監聽器,不一定要是 EditText。) IME 會呼叫監聽器的 onPrepare() 方法,然後在轉場效果開始時呼叫 onStart()。接著,系統會在轉換期間的每個進展階段呼叫 onProgress()。轉換完成後,IME 會呼叫 onEnd()。在轉換過程中的任何時間點,您都可以呼叫 WindowInsetsAnimation.getFraction(),瞭解轉換進度。
如需這些 API 的使用範例,請參閱新的 WindowInsetsAnimation 程式碼範例。
控制 IME 動畫
您也可以控制 IME 動畫,或是其他系統資訊列 (例如導覽列) 的動畫。如要這麼做,請先呼叫 setOnApplyWindowInsetsListener(),為視窗插邊變更設定新的監聽器:
Kotlin
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Java
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
如要移動輸入法編輯器或其他系統列,請呼叫控制器的 controlWindowInsetsAnimation() 方法:
Kotlin
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Java
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
ICU 程式庫更新
Android 11 會更新 android.icu 套件,使用 ICU 程式庫的 66 版,而 Android 10 則使用 63 版。新版程式庫包含更新的 CLDR 語言代碼資料,以及 Android 國際化支援的許多強化功能。
新版程式庫的主要變更包括:
- 許多格式化 API 現在支援新的回傳物件型別,可擴充
FormattedValue。 LocaleMatcherAPI 經過強化,新增了建構工具類別、支援java.util.Locale型別,以及提供相符項目額外資料的結果類別。- 現已支援 Unicode 13。
媒體
分配 MediaCodec 緩衝區
Android 11 包含新的 MediaCodec API,可讓應用程式在分配輸入和輸出緩衝區時,擁有更多控制權。這樣應用程式就能更有效率地管理記憶體。
新課程:
新方法:
MediaCodec.getQueueRequest()MediaCodec.getOutputFrame()MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
此外,MediaCodec.Callback() 中有兩個方法已變更行為:
onInputBufferAvailable()- 如果設定為使用 Block Model API,應用程式應使用
MediaCodec.getQueueRequest和索引,並將 LinearBlock/HardwareBuffer 附加至插槽,而非使用索引呼叫MediaCodec.getInputBuffer()和MediaCodec.queueInputBuffer()。 onOutputBufferAvailable()- 應用程式可使用帶有索引的
MediaCodec.getOutputFrame(),取得含有更多資訊和 LinearBlock/HardwareBuffer 緩衝區的OutputFrame物件,而不必使用帶有索引的MediaCodec.getOutputBuffer()呼叫MediaCodec.getOutputFrame()。
MediaCodec 中的低延遲解碼
Android 11 強化了MediaCodec,可支援遊戲和其他即時應用程式的低延遲解碼。您可以將 FEATURE_LowLatency 傳遞至 MediaCodecInfo.CodecCapabilities.isFeatureSupported(),檢查轉碼器是否支援低延遲解碼。
如要開啟或關閉低延遲解碼功能,請執行下列任一操作:
- 使用
MediaCodec.configure()將新鍵KEY_LOW_LATENCY設為 0 或 1。 - 使用
MediaCodec.setParameters()將新參數鍵PARAMETER_KEY_LOW_LATENCY設為 0 或 1。
新的 AAudio 函式 AAudioStream_release()
函式 AAudioStream_close() 會同時釋放及關閉音訊串流。這可能造成危險。如果另一個程序在串流關閉後嘗試存取,該程序就會異常終止。
新函式 AAudioStream_release() 會釋放串流,但不會關閉串流。這會釋放資源,並將資料流設為已知狀態。物件會持續存在,直到您呼叫 AAudioStream_close() 為止。
MediaParser API
MediaParser 是用於媒體擷取的新低階 API。這項工具比 MediaExtractor 更具彈性,且可進一步控管媒體擷取功能。
從 USB 裝置擷取音訊
如果應用程式沒有 RECORD_AUDIO 權限,並使用 UsbManager 要求直接存取具備音訊擷取功能的 USB 音訊裝置 (例如 USB 耳機),畫面上會出現新的警示訊息,要求使用者確認授予裝置使用權限。系統會忽略所有「一律使用」選項,因此當應用程式要求存取權時,使用者每次都必須查看警示並授予權限。
為避免發生這種情況,應用程式應要求 RECORD_AUDIO 權限。
同時存取麥克風
Android 11 在 AudioRecord、MediaRecorder 和 AAudioStream API 中新增了方法。無論選取的用途為何,這些方法都能啟用及停用同步擷取功能。請參閱「分享音訊輸入內容」。
輸出端切換器
Android 11 為使用 Cast 和 Mediarouter API 的應用程式導入新行為。
除了從應用程式存取投放選項外,切換選項也會顯示在系統媒體播放器中。這樣一來,使用者在不同裝置間切換時,就能享有流暢體驗,例如在廚房觀看影片,或在手機上觀看影片;在家中或車上聆聽音訊。請參閱輸出切換器。
連線能力
Wi-Fi Passpoint 強化功能
如要瞭解 Android 11 新增的 Passpoint 功能,請參閱「Passpoint」。
Wi-Fi Suggestion API 擴展功能
Android 11 擴充了 Wi-Fi 建議 API,可提升應用程式的網路管理功能,包括:
- 連線管理應用程式可允許中斷連線要求,藉此管理自己的網路。
- Passpoint 網路已整合至 Suggestion API,可向使用者建議。
- 您可以使用 Analytics API 取得有關聯播網品質的資訊。
CallScreeningService 更新
自 Android 11 起,CallScreeningService 可以要求取得來電的 STIR/SHAKEN 驗證狀態 (verstat) 資訊。這項資訊會顯示在來電的通話詳細資料中。
如果 CallScreeningService持有READ_CONTACTS權限,當使用者聯絡人中的號碼有來電或撥出電話時,應用程式就會收到通知。
詳情請參閱「防止來電顯示遭竄改」。
Open Mobile API 更新
如要瞭解 Android 11 以上版本支援的 OMAPI,請參閱「支援開放式行動 API 讀取器」。
高效能 VPN
如果應用程式指定 API 級別 30 以上版本,或是在 API 級別 29 以上版本推出的裝置上執行,則可將 IKEv2/IPsec 套用至 VPN,包括使用者設定的 VPN 和應用程式專屬 VPN。
VPN 會在作業系統中原生執行,簡化在應用程式中建立 IKEv2/IPsec VPN 連線所需的程式碼。
依程序控管網路存取權
如要瞭解如何逐一啟用程序的網路存取權,請參閱「管理網路用量」一文。
允許安裝多個具有相同 FQDN 的 Passpoint 設定
從 Android 11 開始,您可以使用 PasspointConfiguration.getUniqueId() 取得 PasspointConfiguration 物件的專屬 ID,讓應用程式使用者安裝多個具有相同完整網域名稱 (FQDN) 的設定檔。
如果電信業者在網路上部署多組行動裝置國家/地區代碼 (MCC) 和行動網路代碼 (MNC) 組合,但只有一個完整網域名稱 (FQDN),這項功能就非常實用。在 Android 11 以上版本中,使用者安裝 MCC 或 MNC 的 SIM 卡時,可以安裝多個與網路相符的設定檔,且這些設定檔具有相同的 FQDN。
支援 GNSS 天線
Android 11 推出 GnssAntennaInfo 類別,讓應用程式能更充分運用全球導航衛星系統 (GNSS) 提供的公分級精確定位。
詳情請參閱天線校正資訊指南。
圖形
NDK 圖片解碼器
NDK ImageDecoder API 提供標準 API,可讓 Android C/C++ 應用程式直接將圖片解碼。應用程式開發人員不再需要使用架構 API (透過 JNI) 或組合第三方圖片解碼程式庫。詳情請參閱圖片解碼器開發人員指南。
影格速率 API
Android 11 提供 API,可讓應用程式將預期影格速率告知系統,以減少支援多種更新率的裝置發生畫面抖動。如要瞭解如何使用這項 API,請參閱影格速率指南。
要求並檢查低延遲支援
某些螢幕可以執行圖像後續處理,例如部分外接螢幕和電視。這項後續處理作業可改善圖像,但可能會增加延遲。支援 HDMI 2.1 的新型螢幕具有自動低延遲模式 (ALLM,也稱為遊戲模式),可關閉後續處理程序,盡量縮短延遲時間。如要進一步瞭解 ALLM,請參閱 HDMI 2.1 規格。
如果可用,視窗可以要求使用自動低延遲模式。ALLM 特別適合遊戲和視訊會議等應用程式,因為這類應用程式的低延遲比最佳畫質更重要。
如要開啟或關閉最低後續處理,請呼叫
Window.setPreferMinimalPostProcessing(),或將視窗的
preferMinimalPostProcessing
屬性設為 true。並非所有螢幕都支援最低後續處理程序;如要瞭解特定螢幕是否支援,請呼叫新方法 Display.isMinimalPostProcessingSupported()。
高效能的圖像偵錯層注入
應用程式現在可將外部圖形層 (GLES、Vulkan) 載入原生應用程式程式碼,以公開與可偵錯應用程式相同的功能,但不會產生效能負擔。使用 GAPID 等工具剖析應用程式時,這項功能尤其重要。如要剖析應用程式,請在應用程式資訊清單檔案中加入下列中繼資料元素,而不是將應用程式設為可偵錯:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
圖片和相機
在擷取畫面期間關閉通知音效和震動
從 Android 11 開始,應用程式在主動使用相機時,可以透過 setCameraAudioRestriction() 僅關閉震動、同時關閉聲音和震動,或兩者都不關閉。
更豐富的 Android Emulator 相機支援功能
如要瞭解 Android 11 以上版本在模擬器中擴大支援的相機功能,請參閱「相機支援」。
支援同時使用多部攝影機
Android 11 新增了 API,可查詢是否支援同時使用多部攝影機,包括前置和後置攝影機。
如要檢查應用程式執行的裝置是否支援這項功能,請使用下列方法:
getConcurrentCameraIds()會傳回攝影機 ID 的組合,這些 ID 可在由相同應用程式程序設定時,以保證的串流組合並行串流。SetisConcurrentSessionConfigurationSupported()會查詢攝影機裝置是否能同時支援對應的會期設定。
更完善地支援含有多個影格的 HEIF 圖片
從 Android 11 開始,如果您呼叫 ImageDecoder.decodeDrawable() 並傳遞含有影格序列的 HEIF 圖片 (例如動畫或連拍相片),這個方法會傳回含有整個圖片序列的 AnimatedImageDrawable。在舊版 Android 中,這個方法只會傳回單一影格的 BitmapDrawable。
如果 HEIF 圖片包含多個非序列的影格,您可以呼叫 MediaMetadataRetriever.getImageAtIndex() 擷取個別影格。
無障礙設定
無障礙服務開發人員最新消息
如果您建立自訂無障礙服務,可以在 Android 11 中使用下列功能:
- 現在除了純文字,無障礙服務的使用者說明也支援 HTML 和圖片。這種彈性可讓您更輕鬆地向使用者說明服務的功能和用途。
- 如要使用語意上比
contentDescription更有意義的 UI 元素狀態說明,請呼叫getStateDescription()方法。 - 如要要求觸控事件略過系統的觸控探索器,請呼叫
setTouchExplorationPassthroughRegion()。同樣地,如要要求手勢略過系統的手勢偵測工具,請呼叫setGestureDetectionPassthroughRegion()。 - 您可以要求執行「輸入」和「下一個」等 IME 動作,以及擷取未啟用
FLAG_SECURE旗標的視窗螢幕截圖。
其他功能
應用程式程序結束原因
Android 11 導入了 ActivityManager.getHistoricalProcessExitReasons() 方法,可回報近期任何程序終止的原因。應用程式可使用這個方法收集當機診斷資訊,例如程序終止是否是由於 ANR、記憶體問題或其他原因。此外,您可以使用新的 setProcessStateSummary() 方法儲存自訂狀態資訊,以供日後分析。
getHistoricalProcessExitReasons() 方法會傳回 ApplicationExitInfo 類別的執行個體,其中包含與應用程式程序終止相關的資訊。只要在這個類別的例項上呼叫 getReason(),即可判斷應用程式的程序遭到終止的原因。舉例來說,如果傳回值為 REASON_CRASH,表示應用程式發生未處理的例外狀況。如果應用程式需要確保結束事件的獨特性,可以維護應用程式專屬的 ID,例如根據 getTimestamp() 方法的時間戳記計算出的雜湊值。
其他資源
如需更多資訊,請參閱 Medium 上的「new Android 11 tools to make apps more private and stable」(Android 11 新工具可讓應用程式更注重隱私權和穩定性) 一文。
資源載入器
Android 11 推出全新 API,可讓應用程式動態擴充資源的搜尋和載入方式。新版 API 類別 ResourcesLoader 和 ResourcesProvider 主要負責提供新功能。兩者共同提供額外資源和資產,或修改現有資源和資產的值。
ResourcesLoader 物件是容器,可將 ResourcesProvider 物件提供給應用程式的 Resources 執行個體。反過來說,ResourcesProvider 物件提供的方法可從 APK 和資源表載入資源資料。
這個 API 的主要用途之一是載入自訂素材資源。您可以使用 loadFromDirectory() 建立 ResourcesProvider,重新導向檔案資源和資產的解析度,導致系統搜尋特定目錄,而非應用程式 APK。您可以透過 AssetManager API 類別的 open() 方法系列存取這些資產,就像存取 APK 中綁定的資產一樣。
APK 簽署配置 v4
Android 11 新增了 APK 簽署配置 v4 的支援。這項配置會在另一個檔案 (apk-name.apk.idsig) 中產生新類型的簽名,但其他方面與 v2 和 v3 類似。APK 不會變更。這項配置支援 ADB 漸進式 APK 安裝,可加快 APK 安裝速度。
動態意圖篩選器
如要接收意圖,應用程式必須在編譯時宣告可接收的資料類型,方法是在應用程式資訊清單中定義意圖篩選器。在 Android 10 以下版本中,應用程式無法在執行階段變更意圖篩選器。這對虛擬化應用程式 (例如虛擬機器和遠端桌面) 來說是個問題,因為這些應用程式無法確切瞭解使用者會在其中安裝哪些軟體。
Android 11 導入了 MIME 群組,這項新的資訊清單元素可讓應用程式在意圖篩選器中宣告動態 MIME 類型集,並在執行階段以程式輔助方式修改。如要使用 MIME 群組,請在應用程式資訊清單中加入含有新 android:mimeGroup 屬性的資料元素:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
android:mimeGroup 屬性的值是任意字串 ID,用於在執行階段識別 MIME 群組。您可以將 MIME 群組的 ID 傳遞至 PackageManager API 類別中的下列新方法,存取及更新 MIME 群組的內容:
以程式輔助方式將 MIME 類型新增至 MIME 群組時,其運作方式與資訊清單中明確宣告的靜態 MIME 類型完全相同。
自動填入功能強化
Android 11 導入了自動填入服務的改良功能。
AssistStructure.ViewNode 中的提示 ID
自動填入服務通常會根據檢視區塊的屬性,計算檢視區塊的簽章雜湊值。計算簽章雜湊時,建議加入檢視提示這個屬性,但提示字串可能會隨著手機的語言代碼而變更。為解決這個問題,Android 11 擴充了 AssistStructure.ViewNode,新增 getHintIdEntry() 方法,可傳回檢視區塊提示文字的資源 ID。這個方法提供與語言代碼無關的值,可用於計算簽章雜湊。
顯示的資料集事件
為協助自動填入服務改善建議,Android 11 提供方法,可識別自動填入服務顯示資料集,但使用者未選取任何資料集的情況。在 Android 11 中,FillEventHistory 會回報新的 TYPE_DATASETS_SHOWN 事件類型。每當自動填入服務向使用者顯示一或多個資料集時,FillEventHistory 就會記錄這類事件。自動填入服務可搭配現有的 TYPE_DATASET_SELECTED 事件使用這些事件,判斷使用者是否選取任何提供的自動填入選項。
輸入法編輯器整合
鍵盤和其他 IME 現在可以在建議列或類似介面中以內嵌方式顯示自動填入建議,而非在下拉式選單中顯示。為保護密碼和信用卡號碼等私密資訊,系統會向使用者顯示建議,但 IME 不會知道建議內容,直到使用者選取其中一項為止。如要瞭解 IME 和密碼管理工具如何支援這項功能,請參閱「將自動填入功能與鍵盤整合」。
與內容擷取服務共用資料
從 Android 11 開始,應用程式可以與裝置的內容擷取服務共用資料。這項功能可讓裝置更輕鬆地提供情境智慧,例如顯示使用者環境中目前播放的歌曲名稱。
如要讓內容擷取服務存取應用程式資料,請在 ContentCaptureManager 的執行個體上呼叫 shareData() 方法。如果系統接受資料共用要求,應用程式會收到唯寫檔案描述元,並與內容擷取服務共用。