功能和 API 概覽
Android 11 面向開發(fā)者引入了一些出色的新功能和 API。以下幾部分內(nèi)容可幫助您了解適用于您的應(yīng)用的功能并開始使用相關(guān) API。
有關(guān)新增、修改和移除的 API 的詳細(xì)列表,請參閱 API 差異報告。如需詳細(xì)了解新的 API,請訪問 Android API 參考文檔 — 新 API 會突出顯示以方便查看。此外,如需了解平臺變更可能會在哪些方面影響您的應(yīng)用,請務(wù)必查看會影響以 Android R 為目標(biāo)平臺的應(yīng)用和所有應(yīng)用的 Android 11 行為變更,以及隱私權(quán)變更。
新體驗(yàn)
屏幕
更好地支持瀑布屏
Android 11 提供了一些 API 以支持瀑布屏,這是一種無邊框的全面屏。這種顯示屏被視為劉海屏的變體?,F(xiàn)有的 DisplayCutout.getSafeInset…() 方法現(xiàn)在會返回能夠避開瀑布區(qū)域以及劉海的安全邊襯區(qū)。如需在瀑布區(qū)域中呈現(xiàn)您的應(yīng)用內(nèi)容,請執(zhí)行以下操作:
調(diào)用
DisplayCutout.getWaterfallInsets()以獲取瀑布邊襯區(qū)的精確尺寸。將窗口布局屬性
layoutInDisplayCutoutMode設(shè)為LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以允許窗口延伸到屏幕各個邊緣上的劉海和瀑布區(qū)域。您必須確保劉?;蚱俨紖^(qū)域中沒有重要的內(nèi)容。
注意:如果您未將上述窗口布局屬性設(shè)為 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,Android 會在黑邊模式下顯示窗口,從而避開缺口和瀑布區(qū)域。
合頁角度傳感器和可折疊設(shè)備
使用 Android 11,可以通過以下方法使運(yùn)行在采用合頁式屏幕配置的設(shè)備上的應(yīng)用能夠確定合頁角度:提供具有 TYPE_HINGE_ANGLE 的新傳感器,以及新的 SensorEvent,后者可以監(jiān)控合頁角度,并提供設(shè)備的兩部分之間的角度測量值。您可以使用這些原始測量值在用戶操作設(shè)備時執(zhí)行精細(xì)的動畫顯示。
盡管對于某些類型的應(yīng)用(例如啟動器和壁紙)而言,知道確切的合頁角度會很有用,但大多數(shù)應(yīng)用都應(yīng)該使用 Jetpack 窗口管理器庫,通過調(diào)用 DeviceState.getPosture() 檢索設(shè)備狀態(tài)。
或者,您的應(yīng)用也可以調(diào)用 registerDeviceStateChangeCallback(),以在 DeviceState 更改時收到通知,并在狀態(tài)發(fā)生變化時做出響應(yīng)。
由于目前市場上已經(jīng)有且未來還會出現(xiàn)更多不同的窗口和設(shè)備配置,因此對設(shè)備狀態(tài)做出響應(yīng)更加安全可靠。
會話
Android 11 對會話的處理方式進(jìn)行了多項(xiàng)改進(jìn)。會話是滿足以下條件的通信:
- 具有實(shí)時性。
- 可為雙向或多向通信,但不能是單向的性質(zhì)。
- 在兩人或更多人(不能是聊天機(jī)器人)之間進(jìn)行。
現(xiàn)在,這些會話顯示于各自的區(qū)域中,這些會話的通知會突出顯示并具有額外的功能:
- 如果用戶長按會話通知,系統(tǒng)會為用戶提供多個選項(xiàng):
- 將會話提升為氣泡(如果應(yīng)用支持氣泡)。
- 為此會話創(chuàng)建快捷方式并將其添加到主屏幕。
- 將此會話的通知設(shè)為靜音或暫停通知。
- 將此會話標(biāo)記為非常重要。
- 通知的設(shè)計采用新版本的
MessagingStyle,突出了用于代表用戶的頭像,同時還顯示了進(jìn)行會話的應(yīng)用的圖標(biāo)。
要確定某個會話以便對其進(jìn)行這種特殊處理,應(yīng)用需要向該會話發(fā)布快捷方式,這可以通過調(diào)用現(xiàn)有的 ShortcutManager 方法 setDynamicShortcuts() 或 addDynamicShortcuts() 來完成。此快捷方式必須長期存在并附有個人數(shù)據(jù),用于標(biāo)識會話中的對方參與者。我們還建議您為快捷方式設(shè)置 LocusId,并使用該 LocusId 注釋應(yīng)用內(nèi) Activity 和 Fragment。這樣做有助于系統(tǒng)根據(jù)應(yīng)用的使用情況對對話進(jìn)行準(zhǔn)確排名。
如果某個對話已不存在,應(yīng)用可以使用 ShortcutManager.removeLongLivedShortcuts() 來刪除相應(yīng)快捷方式;這樣做會讓系統(tǒng)刪除與該對話關(guān)聯(lián)的所有數(shù)據(jù)。
當(dāng)應(yīng)用發(fā)送與會話相關(guān)的通知時,您必須使用 MessagingStyle 并包含會話快捷方式的鏈接。這樣做可讓系統(tǒng)為您的通知提供特殊的對話處理。
根據(jù)用戶行為,系統(tǒng)可能會將某些對話指定為特別重要并進(jìn)行緩存,讓它們看起來更加顯眼。您的應(yīng)用不能影響對話是否會得到這種優(yōu)先處理,但您可以通過調(diào)用新方法 ShortcutManager.getShortcuts() 并傳遞 FLAG_MATCH_CACHED 來找出當(dāng)前緩存了哪些對話。
改進(jìn)了會話
Android 11 對會話的處理方式進(jìn)行了多項(xiàng)改進(jìn)。會話是兩人或更多人之間的實(shí)時雙向通信。這些會話具有特殊的重要性,并且用戶在如何與其進(jìn)行交互方面有多個新的選項(xiàng)可以選擇。
如需詳細(xì)了解會話以及您的應(yīng)用如何支持會話,請參閱會話。
聊天氣泡
借助氣泡,用戶可以從設(shè)備上的任何位置輕松進(jìn)行多任務(wù)處理。氣泡的設(shè)計目的是成為 SYSTEM_ALERT_WINDOW 的替代方案。
注意:“氣泡”功能內(nèi)置在開發(fā)者預(yù)覽版中,僅供開發(fā)者使用,該功能不應(yīng)該用于生產(chǎn)。默認(rèn)情況下,氣泡處于禁用狀態(tài)。開發(fā)者可在開發(fā)者選項(xiàng)設(shè)置中啟用該功能。
[圖片上傳失敗...(image-c66076-1590046907721)]
氣泡內(nèi)置于通知系統(tǒng)中。它們懸浮在其他應(yīng)用內(nèi)容之上,并會跟隨用戶移動到任何位置。氣泡可以展開以顯示應(yīng)用功能和信息,并可在不使用時收起。
當(dāng)設(shè)備處于鎖定狀態(tài)或“顯示屏始終開啟”功能啟用時,氣泡的顯示方式和常規(guī)通知相同。
氣泡是一種可以選擇停用的功能。在應(yīng)用顯示第一個氣泡時,系統(tǒng)會彈出權(quán)限對話框,提供兩個選項(xiàng):
- 屏蔽來自您應(yīng)用的所有氣泡 - 系統(tǒng)不會屏蔽通知,但永遠(yuǎn)不會以氣泡形式顯示通知
- 允許來自您應(yīng)用的所有氣泡 - 通過
BubbleMetaData發(fā)送的所有通知都會以氣泡形式顯示
Bubble API
氣泡通過 Notification API 創(chuàng)建,因此您可以正常發(fā)送通知。如果您想讓通知以氣泡形式顯示,則需要附加一些額外數(shù)據(jù)。
氣泡的展開視圖從您選擇的 Activity 中創(chuàng)建,因此該 Activity 需要經(jīng)過配置才能以氣泡形式妥善顯示。此 Activity 必須是大小可調(diào)的嵌入式 Activity,并且始終在文檔界面模式中啟動。如果這些要求中的任何一項(xiàng)無法得到滿足,該 Activity 都將以通知形式顯示。
以下代碼演示如何實(shí)現(xiàn)簡單的氣泡:
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:documentLaunchMode="always"
android:resizeableActivity="true"
/>
如果您的應(yīng)用顯示多個相同類型的氣泡(例如與不同聯(lián)系人的多個聊天對話),則該 Activity 必須能夠啟動多個實(shí)例。將 documentLaunchMode 設(shè)置為“always”。
如要發(fā)送氣泡,請按以下步驟操作:
- 按照一般步驟創(chuàng)建通知。
- 調(diào)用
Notification.BubbleMetadata.Builder以創(chuàng)建 BubbleMetadata 對象。 - 使用
setBubbleMetadata將元數(shù)據(jù)添加到通知。
// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);
// Create bubble metadata
Notification.BubbleMetadata bubbleData =
new Notification.BubbleMetadata.Builder()
.setDesiredHeight(600)
.setIcon(Icon.createWithResource(context, R.drawable.icon))
.setIntent(bubbleIntent)
.build();
// Create notification
Person chatBot = new Person.Builder()
.setBot(true)
.setName("BubbleBot")
.setImportant(true)
.build();
Notification.Builder builder =
new Notification.Builder(mContext, CHANNEL_ID)
.setContentIntent(contentIntent)
.setSmallIcon(smallIcon)
.setBubbleMetadata(bubbleData)
.addPerson(chatBot);
注意:首次發(fā)送顯示氣泡的通知時,您必須使用具有 IMPORTANCE_MIN 或更高級別的通知渠道。
如果發(fā)送氣泡時您的應(yīng)用位于前臺,則系統(tǒng)會忽略重要性并始終顯示您的氣泡(除非用戶屏蔽了來自您應(yīng)用的氣泡或通知)。
創(chuàng)建展開的氣泡
您可將氣泡配置為自動以展開狀態(tài)顯示。我們建議您,僅在用戶執(zhí)行會顯示氣泡的操作(例如點(diǎn)按按鈕以開始新聊天)時使用此功能。在這種情況下,您也有必要禁止顯示在創(chuàng)建氣泡時發(fā)送的初始通知。
您可以使用以下方法設(shè)置啟用這些行為的標(biāo)記:setAutoExpandBubble() 和 setSuppressInitialNotification()。
Notification.BubbleMetadata bubbleData =
new Notification.BubbleMetadata.Builder()
.setDesiredHeight(600)
.setIntent(bubbleIntent)
.setAutoExpandBubble(true)
.setSuppressInitialNotification(true)
.build();
氣泡內(nèi)容生命周期
當(dāng)氣泡展開時,內(nèi)容 Activity 會經(jīng)歷常規(guī)進(jìn)程生命周期,從而使應(yīng)用成為前臺進(jìn)程(如果應(yīng)用尚未在前臺運(yùn)行)。
當(dāng)氣泡被收起或關(guān)閉時,系統(tǒng)會銷毀該 Activity。這可能導(dǎo)致系統(tǒng)緩存進(jìn)程,并在之后將其終止,具體取決于應(yīng)用是否有正在運(yùn)行的其他前臺組件。
顯示氣泡的時機(jī)
為減少干擾用戶的次數(shù),氣泡僅在滿足以下一個或多個條件時顯示:
- 通知使用 MessagingStyle,并添加了 Person。
- 通知來自對 Service.startForeground 的調(diào)用,擁有 CATEGORY_CALL 類別,并添加了 Person。
- 發(fā)送通知時,應(yīng)用在前臺運(yùn)行。
如果上述條件均不滿足,則僅顯示通知。
最佳實(shí)踐
- 氣泡會占用屏幕空間,并遮擋其他應(yīng)用內(nèi)容。您應(yīng)僅在非常有必要(例如持續(xù)通信)或用戶明確要求將某些內(nèi)容顯示為氣泡時,才以氣泡形式發(fā)送通知。
- 請注意,用戶可以禁用氣泡。在這種情況下,氣泡通知以正常通知形式顯示。同時,您應(yīng)始終確保您的氣泡通知以正常通知形式顯示。
- 從氣泡啟動的進(jìn)程(例如)會在氣泡容器中顯示。也就是說氣泡可以擁有任務(wù)堆棧。如果您的氣泡中有許多功能或?qū)Ш?,情況就會變得很復(fù)雜。我們建議您盡量讓功能保持輕量具體。
在快速回復(fù)中使用富媒體
從 Android 11 開始,用戶可以在快速回復(fù)中插入圖片和其他富媒體內(nèi)容。如需支持此功能,應(yīng)用需要向 RemoteInput 通知添加信息,指定可以處理的 MIME 類型。應(yīng)用可以通過調(diào)用 RemoteInput.Builder.setAllowDataType() 執(zhí)行此操作。此外,應(yīng)用還必須檢查收到的任何 RemoteInput 廣播,以查看廣播是否包含其中任何一種類型的內(nèi)容;應(yīng)用可使用 RemoteInput.getDataResultsFromIntent() 執(zhí)行此操作。
通知的設(shè)計由系統(tǒng)模板決定,您的應(yīng)用只需定義模板各部分的內(nèi)容。通知的某些詳細(xì)信息僅在展開視圖中顯示。
- 小圖標(biāo):此為必要圖標(biāo),通過
[setSmallIcon()]設(shè)置。 - 應(yīng)用名稱:此由系統(tǒng)提供。
- 時間戳:此由系統(tǒng)提供,不過您可以通過
[setWhen()]進(jìn)行替換,或使用[setShowWhen(false)]將其隱藏。 - 大圖標(biāo):此為可選圖標(biāo)(通常僅用于聯(lián)系人照片;請勿將其用于應(yīng)用圖標(biāo)),通過
[setLargeIcon()]設(shè)置。 - 標(biāo)題:此為可選內(nèi)容,通過
[setContentTitle()]設(shè)置。 - 文本:此為可選內(nèi)容,通過
[setContentText()]設(shè)置。
如需詳細(xì)了解如何使用上述及更多功能創(chuàng)建通知,請參閱創(chuàng)建通知。
與內(nèi)容捕獲服務(wù)共享數(shù)據(jù)
從 Android 11 開始,應(yīng)用可以與設(shè)備的內(nèi)容捕獲服務(wù)共享數(shù)據(jù)。借助此功能,設(shè)備可以更輕松地提供情境智能,例如顯示用戶環(huán)境中正在播放的歌曲的名稱,或者在用戶靠近車站或機(jī)場時顯示相關(guān)的旅行信息。
如需將應(yīng)用中的數(shù)據(jù)共享給內(nèi)容捕獲服務(wù),請對 ContentCaptureManager 的實(shí)例調(diào)用 shareData() 方法。如果系統(tǒng)接受數(shù)據(jù)共享請求,應(yīng)用會收到將與內(nèi)容捕獲服務(wù)共享的只寫文件描述符。
5G 圖標(biāo)顯示
在 Android 11(API 級別“R”)及更高版本中,具有 android.Manifest.permission.READ_PHONE_STATE 權(quán)限的應(yīng)用可以通過 PhoneStateListener.onDisplayInfoChanged() 請求更新電話顯示信息,其中包括用于營銷和品牌塑造的無線接入技術(shù)信息。
這款新 API 提供了適用于不同運(yùn)營商的各種 5G 圖標(biāo)顯示解決方案。支持的技術(shù)包括:
- LTE
- 采用載波聚合技術(shù)的 LTE (LTE+)
- 高級專業(yè)版 LTE (5Ge)
- NR (5G)
- 毫米波移動網(wǎng)絡(luò)頻段上的 NR (5G+)
隱私權(quán)
Android 11 引入了大量變更和限制,目的是加強(qiáng)用戶隱私保護(hù)。如需了解詳情,請參閱隱私權(quán)頁面。
重大隱私權(quán)變更
下表匯總了 Android 11 中與隱私權(quán)相關(guān)的主要變更。
| | 隱私權(quán)變更 | 受影響的應(yīng)用 | 緩解策略 |
| | 分區(qū)存儲強(qiáng)制執(zhí)行
以 Android 11 為目標(biāo)平臺的應(yīng)用始終會受分區(qū)存儲行為的影響 | 以 Android 11 為目標(biāo)平臺的應(yīng)用,以及以 Android 10 為目標(biāo)平臺且未將 requestLegacyExternalStorage 設(shè)為 true 以停用分區(qū)存儲的應(yīng)用 | 更新您的應(yīng)用以使用分區(qū)存儲
詳細(xì)了解分區(qū)存儲變更 |
| | 一次性權(quán)限
通過一次性權(quán)限,用戶可以向位置、麥克風(fēng)和攝像頭授予臨時訪問權(quán)限 | 以任何版本為目標(biāo)平臺且請求位置信息、麥克風(fēng)或攝像頭權(quán)限的應(yīng)用 | 在嘗試訪問受某項(xiàng)權(quán)限保護(hù)的數(shù)據(jù)之前,檢查您的應(yīng)用是否具有該權(quán)限
遵循權(quán)限方面的最佳做法 |
| | 后臺位置信息訪問權(quán)限
Android 11 更改了應(yīng)用向用戶請求后臺位置信息權(quán)限的方式 | 目標(biāo)平臺為 Android 11 且需要隨時訪問位置信息的應(yīng)用 | 通過對權(quán)限請求方法的多次單獨(dú)調(diào)用,逐步請求前臺(粗略或精確)和后臺位置權(quán)限。在每次請求之前,使用全屏視圖向用戶說明授予該權(quán)限所能得到的益處
詳細(xì)了解后臺位置信息訪問權(quán)限 |
| | 軟件包可見性
Android 11 更改了應(yīng)用查詢同一設(shè)備上的其他已安裝應(yīng)用及與之交互的方式 | 以 Android 11 為目標(biāo)平臺且與設(shè)備上的其他已安裝應(yīng)用交互的應(yīng)用 | 將 <queries> 元素添加到應(yīng)用的清單
詳細(xì)了解軟件包可見性 |
| | 前臺服務(wù)類型
Android 11 更改了前臺服務(wù)訪問攝像頭和麥克風(fēng)數(shù)據(jù)的方式 | 以 Android 11 為目標(biāo)平臺且在前臺服務(wù)中訪問攝像頭或麥克風(fēng)的應(yīng)用 | 分別在訪問攝像頭數(shù)據(jù)和麥克風(fēng)數(shù)據(jù)的服務(wù)中聲明 camera 和 microphone 前臺服務(wù)類型
詳細(xì)了解新的前臺服務(wù)類型 |
安全
生物識別身份驗(yàn)證機(jī)制更新
為了幫助您控制應(yīng)用數(shù)據(jù)的安全級別,Android 11 對生物識別身份驗(yàn)證機(jī)制進(jìn)行了多項(xiàng)改進(jìn)。
身份驗(yàn)證類型
Android 11 引入了 BiometricManager.Authenticators 接口,該接口定義了 BiometricManager 類支持的身份驗(yàn)證類型:
使用滿足兼容性定義頁面上定義的強(qiáng)強(qiáng)度級別要求的硬件元素進(jìn)行身份驗(yàn)證。
使用滿足兼容性定義頁面上定義的弱強(qiáng)度級別要求的硬件元素進(jìn)行身份驗(yàn)證。
使用屏幕鎖定憑據(jù)(即用戶的 PIN 碼、解鎖圖案或密碼)進(jìn)行身份驗(yàn)證。
如需定義您的應(yīng)用接受的生物識別身份驗(yàn)證類型,請向 setAllowedAuthenticators() 方法傳遞一個身份驗(yàn)證類型或按位類型組合。例如,如果您的應(yīng)用接受“強(qiáng)”硬件元素或屏幕鎖定憑據(jù),請傳入 BIOMETRIC_STRONG | DEVICE_CREDENTIAL。
如需檢查是否有必要的身份驗(yàn)證元素,請將同一按位類型組合傳入 canAuthenticate() 方法。如有必要,請調(diào)用 ACTION_BIOMETRIC_ENROLL intent 操作。在 intent extra 中,提供您的應(yīng)用可接受的一組身份驗(yàn)證器。該 intent 會提示用戶為您的應(yīng)用接受的身份驗(yàn)證器注冊憑據(jù)。
注意:為了注冊身份驗(yàn)證器,用戶需要創(chuàng)建 PIN 碼、解鎖圖案或密碼。如果用戶還沒有 PIN 碼、解鎖圖案或密碼,生物識別注冊流程會提示他們創(chuàng)建一個。
在用戶進(jìn)行身份驗(yàn)證后,您可以通過調(diào)用 getAuthenticationType() 檢查用戶是使用設(shè)備憑據(jù)還是生物識別憑據(jù)進(jìn)行的身份驗(yàn)證。
對“每次使用時進(jìn)行身份驗(yàn)證”密鑰的額外支持
Android 11 在 BiometricPrompt 類中提供了對“每次使用時進(jìn)行身份驗(yàn)證”密鑰的更多支持。此類密鑰要求每次您的應(yīng)用需要訪問受該密鑰保護(hù)的數(shù)據(jù)時,用戶都必須提供生物識別憑據(jù)、設(shè)備憑據(jù)或上述任一憑據(jù)?!懊看问褂脮r進(jìn)行身份驗(yàn)證”密鑰對高價值的事務(wù)(如支付大筆款項(xiàng)或更新個人的健康檔案)很有用。
如需將 BiometricPrompt 對象與“每次使用時進(jìn)行身份驗(yàn)證”密鑰相關(guān)聯(lián),請?zhí)砑宇愃埔韵碌拇a:
KeyGenParameterSpec authPerOpKeyGenParameterSpec = new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
// Accept either a biometric credential or a device credential.
// To accept only one type of credential, include only that type as the
// 2nd argument.
.setUserAuthenticationParameters(0 /* duration */,
KeyProperties.AUTH_BIOMETRIC_STRONG |
KeyProperties.AUTH_DEVICE_CREDENTIAL)
.build();
已棄用的方法
Android 11 棄用了以下方法:
-
setDeviceCredentialAllowed()方法。 -
setUserAuthenticationValidityDurationSeconds()方法。 - 不帶任何參數(shù)的
canAuthenticate()過載版本。
安全共享大型數(shù)據(jù)集
在某些情況下,例如涉及機(jī)器學(xué)習(xí)或媒體播放時,您的應(yīng)用可能需要與其他應(yīng)用使用同一個大型數(shù)據(jù)集。在較早的 Android 版本中,您的應(yīng)用與其他應(yīng)用需要各自單獨(dú)下載該數(shù)據(jù)集。
為幫助減少網(wǎng)絡(luò)中和磁盤上的數(shù)據(jù)冗余,Android 11 允許使用共享數(shù)據(jù) blob 在設(shè)備上緩存這些大型數(shù)據(jù)集。如需詳細(xì)了解如何共享數(shù)據(jù)集,請參閱有關(guān)共享大型數(shù)據(jù)集的深度指南。
性能和質(zhì)量
無線調(diào)試
Android 11 支持通過 Android 調(diào)試橋 (adb) 從工作站以無線方式部署和調(diào)試應(yīng)用。例如,您可以將可調(diào)試的應(yīng)用部署到多臺遠(yuǎn)程設(shè)備,而無需通過 USB 實(shí)際連接您的設(shè)備,從而避免常見的 USB 連接問題(例如驅(qū)動程序安裝方面的問題)。
如需使用無線調(diào)試,您需要使用配對碼將您的設(shè)備與工作站配對。您的工作站和設(shè)備必須連接到同一無線網(wǎng)絡(luò)。如需連接到您的設(shè)備,請按以下步驟操作:
- 在您的工作站上,更新到最新版本的 SDK 平臺工具。
- 在設(shè)備上啟用開發(fā)者選項(xiàng)。
- 啟用無線調(diào)試選項(xiàng)。
- 在詢問要在此網(wǎng)絡(luò)上允許無線調(diào)試嗎?的對話框中,點(diǎn)擊允許。
- 選擇使用配對碼配對設(shè)備。記下設(shè)備上顯示的配對碼、IP 地址和端口號(參見圖片)。
- 在工作站上,打開一個終端并導(dǎo)航到
android_sdk。 - 運(yùn)行
adb pair ipaddr port。使用第 5 步中的 IP 地址和端口號。 - 當(dāng)系統(tǒng)提示時,輸入您在第 5 步中獲得的配對碼。系統(tǒng)會顯示一條消息,表明您的設(shè)備已成功配對。
Enter pairing code: 482924
Successfully paired to 192.168.1.130:37099 [guid=adb-235XY]
- (僅適用于 Linux 或 Microsoft Windows)運(yùn)行
adb connect ipaddr :port。使用無線調(diào)試下的 IP 地址和端口(參見下圖)。
ADB 增量 APK 安裝
在設(shè)備上安裝大型(2GB 以上)APK 可能需要很長的時間,即使應(yīng)用只是稍作更改也是如此。ADB(Android 調(diào)試橋)增量 APK 安裝可以安裝足夠的 APK 以啟動應(yīng)用,同時在后臺流式傳輸剩余數(shù)據(jù),從而加速這一過程。如果設(shè)備支持該功能,并且您安裝了最新的 SDK 平臺工具,adb install 將自動使用此功能。如果不支持,系統(tǒng)會自動使用默認(rèn)安裝方法。
運(yùn)行以下 adb 命令以使用該功能。如果設(shè)備不支持增量安裝,該命令將會失敗并輸出詳細(xì)的解釋。
adb install --incremental
在運(yùn)行 ADB 增量 APK 安裝之前,您必須先為 APK 簽名并創(chuàng)建一個 APK 簽名方案 v4 文件。必須將 v4 簽名文件放在 APK 旁邊,才能使此功能正常運(yùn)行。
使用原生內(nèi)存分配器進(jìn)行錯誤檢測
GWP-ASan 是一種原生內(nèi)存分配器功能,可幫助查找釋放后使用和堆緩沖區(qū)溢出錯誤。您可以全局啟用此功能,也可以為應(yīng)用的特定子進(jìn)程啟用此功能。如需了解詳情,請參閱 GWP-Asan 指南。
Neural Networks API 1.3
Android 11 擴(kuò)展并改進(jìn)了 Neural Networks API (NNAPI)。
新運(yùn)算方式
NNAPI 1.3 引入了新的運(yùn)算數(shù)類型 TENSOR_QUANT8_ASYMM_SIGNED,以支持 TensorFlow Lite 的新量化方案。
此外,NNAPI 1.3 還引入了以下新運(yùn)算:
QUANTIZED_LSTMIFWHILEELUHARD_SWISHFILLRANK
新的機(jī)器學(xué)習(xí)控件
NNAPI 1.3 引入了新控件以幫助機(jī)器學(xué)習(xí)流暢運(yùn)行:
-
QoS API:新的 Quality of Service API 使用以下新函數(shù),支持在 NNAPI 中進(jìn)行優(yōu)先排序和任務(wù)截止時間設(shè)定:
-
內(nèi)存域輸入/輸出:NNAPI 1.3 支持將內(nèi)存域作為執(zhí)行的輸入和輸出。這樣可以移除不同系統(tǒng)組件之間不必要的相同數(shù)據(jù),從而提高 Android 神經(jīng)網(wǎng)絡(luò)的運(yùn)行時性能。此功能添加了一組用于與
ANeuralNetworksMemoryDesc和ANeuralNetworkMemory對象結(jié)合使用的新 NDK API,包括以下函數(shù):ANeuralNetworksMemoryDesc_create()ANeuralNetworksMemoryDesc_free()ANeuralNetworksMemoryDesc_addInputRole()ANeuralNetworksMemoryDesc_addOutputRole()ANeuralNetworksMemoryDesc_setDimensions()ANeuralNetworksMemoryDesc_finish()ANeuralNetworksMemory_createFromDesc()ANeuralNetworksMemory_copy()
如需了解詳情,請參閱神經(jīng)網(wǎng)絡(luò)內(nèi)存域示例。
-
Dependency API 和同步柵欄支持:NNAPI 1.3 支持使用依賴項(xiàng)實(shí)現(xiàn)異步計算,這樣可以大大減少調(diào)用小型鏈?zhǔn)侥P蜁r產(chǎn)生的開銷。此功能添加了以下新函數(shù):
-
控制流:NNAPI 1.3 支持使用新的圖表運(yùn)算
ANEURALNETWORKS_IF和ANEURALNETWORKS_WHILE實(shí)現(xiàn)常規(guī)控制流,這些運(yùn)算使用新的ANEURALNETWORKS_MODEL運(yùn)算數(shù)類型接受其他模型作為參數(shù)。此外,此功能還添加了以下新函數(shù):
NDK Thermal API
當(dāng)設(shè)備過熱時,它們可能會限制 CPU 和/或 GPU,而這可能會以意想不到的方式影響應(yīng)用。如果應(yīng)用或游戲包含復(fù)雜圖形,大量計算或持續(xù)網(wǎng)絡(luò)活動,它們就更容易遇到問題。
在 Android 11 中使用 NDK Thermal API 監(jiān)控設(shè)備上的溫度變化,然后采取相應(yīng)措施以降低耗電量和設(shè)備溫度。該 API 類似于Java Thermal API;您可以使用它接收任何熱狀態(tài)更改的通知或直接輪詢當(dāng)前狀態(tài)。
文本和輸入
改進(jìn)了 IME 轉(zhuǎn)換
Android 11 引入了新的 API 以改進(jìn)輸入法 (IME) 的轉(zhuǎn)換,例如屏幕鍵盤。這些 API 可讓您更輕松地調(diào)整應(yīng)用內(nèi)容,與 IME 的出現(xiàn)和消失以及狀態(tài)和導(dǎo)航欄等其他元素保持同步。
如需在聚焦至任何 EditText 時顯示 IME,請調(diào)用 view.getInsetsController().[show(Type.ime())](https://developer.android.com/reference/android/view/WindowInsetsController#show(int))(您可以在與聚焦的 EditText 相同層次結(jié)構(gòu)中的任何視圖上調(diào)用此方法,無需專門在 EditText 上調(diào)用它)。如需隱藏 IME,請調(diào)用 view.getInsetsController().[hide(Type.ime())](https://developer.android.com/reference/android/view/WindowInsetsController#hide(int))。您可以通過調(diào)用 view.getRootWindowInsets().[isVisible(Type.ime())](https://developer.android.com/reference/android/view/WindowInsets#isVisible(int)) 檢查 IME 當(dāng)前是否可見。
如需同步應(yīng)用的視圖與 IME 的顯示和消失,請通過提供 WindowInsetsAnimation.Callback 到 View.setWindowInsetsAnimationCallback() 在視圖上設(shè)置監(jiān)聽器(您可以在任何視圖上設(shè)置該監(jiān)聽器,它不一定必須為 EditText)。IME 會調(diào)用監(jiān)聽器的 onPrepare() 方法,之后會在轉(zhuǎn)換開始時調(diào)用 onStart()。然后,它會在每次轉(zhuǎn)換的過程中調(diào)用 onProgress()。轉(zhuǎn)換完成后,IME 會調(diào)用 onEnd()。在轉(zhuǎn)換過程中,您隨時可以調(diào)用 WindowInsetsAnimation.getFraction() 以了解轉(zhuǎn)換的進(jìn)度。
有關(guān)如何使用這些 API 的示例,請參閱新的 WindowInsetsAnimation 代碼示例。
控制 IME 動畫
您還可以控制 IME 動畫或其他系統(tǒng)欄(如導(dǎo)航欄)的動畫。如需執(zhí)行此操作,請先調(diào)用 setOnApplyWindowInsetsListener(),為窗口邊襯區(qū)更改設(shè)置新的監(jiān)聽器:
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;
}
});
如需移動 IME 或其他系統(tǒng)欄,請調(diào)用控制器的 controlWindowInsetsAnimation() 方法:
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 語言區(qū)域數(shù)據(jù)以及眾多對于 Android 中的國際化支持的增強(qiáng)功能。
新版庫包含以下主要變更:
- 許多格式化 API 現(xiàn)在都支持可擴(kuò)展
FormattedValue的新返回對象類型。 -
LocaleMatcherAPI 在以下方面得到增強(qiáng):提供了構(gòu)建器類,支持java.util.Locale類型,并且結(jié)果類可提供有關(guān)匹配的額外數(shù)據(jù)。 - 現(xiàn)在支持 Unicode 13。
媒體
分配 MediaCodec 緩沖區(qū)
Android 11 包含一個新的 MediaCodec API,可讓應(yīng)用在分配輸入和輸出緩沖區(qū)時獲得更多控制。這樣可以讓您的應(yīng)用更高效地管理內(nèi)存。
新類:
新方法:
MediaCodec.getQueueRequest()MediaCodec.getOutputFrame()MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
此外,MediaCodec.Callback() 中兩種方法的行為也發(fā)生了變化:
如果配置為使用 Block Model API,應(yīng)用應(yīng)通過索引使用 MediaCodec.getQueueRequest,并將 LinearBlock/HardwareBuffer 附加到插槽,而不是通過索引調(diào)用 MediaCodec.getInputBuffer() 和 MediaCodec.queueInputBuffer()。
應(yīng)用可以通過索引使用 MediaCodec.getOutputFrame() 獲取包含更多信息的 OutputFrame 對象和 LinearBlock/HardwareBuffer 緩沖區(qū),而不是通過索引調(diào)用 MediaCodec.getOutputBuffer()。
</dl>
MediaCodec 低延時解碼
Android 11 增強(qiáng)了 MediaCodec,針對游戲和其他實(shí)時應(yīng)用支持低延時解碼。您可以將 FEATURE_LowLatency 傳遞到 MediaCodecInfo.CodecCapabilities.isFeatureSupported(),檢查編解碼器是否支持低延時解碼。
如需啟用或停用低延時解碼,請執(zhí)行以下任一操作:
- 使用
MediaCodec.configure()將新鍵KEY_LOW_LATENCY設(shè)置為 0 或 1。 - 使用
MediaCodec.setParameters()將新參數(shù)鍵PARAMETER_KEY_LOW_LATENCY設(shè)置為 0 或 1。
注意:支持低延時解碼可能需要額外的資源,例如更高的功耗。僅在必要時使用低延時解碼。
已棄用 OpenSL ES
從 NDK r21b Beta 版 2 開始,已棄用 OpenSL ES API。您應(yīng)改用 Oboe。
平臺仍支持現(xiàn)有應(yīng)用的 OpenSL ES。然而,使用 minSdkVersion 為 30 或更高版本的 OpenSL ES 時,系統(tǒng)會顯示構(gòu)建警告。
新的 AAudio 函數(shù) AAudioStream_release()
函數(shù) AAudioStream_close() 會同時釋放和關(guān)閉音頻流。這可能很危險。如果其他進(jìn)程在音頻流關(guān)閉后嘗試對其進(jìn)行訪問,該進(jìn)程將會崩潰。
新函數(shù) AAudioStream_release() 會釋放音頻流,但不會將其關(guān)閉。這樣會釋放其資源并使音頻流處于已知狀態(tài)。該對象將一直存在,直到您調(diào)用 AAudioStream_close()。
MediaParser API
MediaParser 是用于媒體提取的新型低級別 API。它比 MediaExtractor 更靈活,并提供對媒體提取功能的額外控制。
網(wǎng)絡(luò)連接
Wi-Fi Passpoint 增強(qiáng)功能
通過 Passpoint,應(yīng)用可以自動靜默地執(zhí)行身份驗(yàn)證并連接到安全的 Wi-Fi 熱點(diǎn)。以 API 級別“R”及更高級別為目標(biāo)平臺的應(yīng)用可以使用 Passpoint 的以下附加功能。
失效日期強(qiáng)制執(zhí)行和通知
對個人資料強(qiáng)制執(zhí)行失效日期可讓框架避免使用過期憑據(jù)自動連接到接入點(diǎn),該操作必定會失敗。這樣可以阻止無線連接,并節(jié)省電量和后端帶寬。當(dāng)用戶的個人資料位于范圍內(nèi)但已過期時,該功能會向用戶顯示通知。
FQDN 匹配
允許使用 PerProviderSubscription (PPS) 管理對象 (MO) 中的 Extension/Android 節(jié)點(diǎn),配置獨(dú)立于接入網(wǎng)絡(luò)查詢協(xié)議 (ANQP) 完全限定域名 (FQDN) 的命名 AAA 域。
自簽名的私人 CA
對于 Passpoint R1 個人資料,Android 接受采用私人自簽名 CA 進(jìn)行連接身份驗(yàn)證。
允許使用具有相同 FQDN 的多個個人資料
允許安裝具有相同 FQDN 的多個 Passpoint 個人資料。FQDN 不用作個人資料的鍵。需要 FQDN 的現(xiàn)有 Passpoint API(如 remove)會將請求應(yīng)用于具有相同 FQDN 的所有匹配的個人資料。
允許安裝沒有根 CA 證書的個人資料
允許使用沒有根 CA 證書的個人資料。在這種情況下,系統(tǒng)會根據(jù)安裝在信任庫中的公共根 CA 證書驗(yàn)證 AAA 服務(wù)器證書。
改進(jìn)了家庭網(wǎng)絡(luò)服務(wù)提供商和漫游服務(wù)提供商的匹配
系統(tǒng)會匹配家庭網(wǎng)絡(luò)或漫游網(wǎng)絡(luò),而不考慮所通告的身份驗(yàn)證方法。此外,還增加了對 OtherHomePartners 和 HomeOIList 列表的家庭網(wǎng)絡(luò)匹配功能的支持。
Wi-Fi Suggestion API 擴(kuò)展
Android 11 擴(kuò)展了 Wi-Fi Suggestion API,以提高應(yīng)用的網(wǎng)絡(luò)管理能力,包括:
- 連接管理應(yīng)用可以通過允許斷開連接請求管理自己的網(wǎng)絡(luò)。
- Passpoint 網(wǎng)絡(luò)集成到 Suggestion API 中,可以推薦給用戶。
- 通過 Analytics API,您可以獲取有關(guān)網(wǎng)絡(luò)質(zhì)量的信息。
CallScreeningService 更新
從 Android 11 開始,CallScreeningService 可以針對來電請求有關(guān) STIR/SHAKEN 驗(yàn)證狀態(tài) (verstat) 的信息。此信息將包含在來電的通話詳情中。
如果 CallScreeningService 持有 READ_CONTACTS 權(quán)限,當(dāng)收到用戶聯(lián)系人號碼的來電或撥打用戶聯(lián)系人號碼時,應(yīng)用會收到通知。
GNSS 天線支持
Android 11 引入了 GnssAntennaInfo 類,讓您的應(yīng)用能夠更多地利用全球?qū)Ш叫l(wèi)星系統(tǒng) (GNSS) 提供的厘米精度定位。用戶向您的應(yīng)用授予 ACCESS_FINE_LOCATION 權(quán)限之后,您的應(yīng)用可以訪問與 GNSS 天線相關(guān)的以下詳細(xì)信息:
- 相位中心偏移 (PCO) 坐標(biāo)
- 相位中心變化 (PCV) 校正
- 信號增益校正
如需確定設(shè)備是否可以向您的應(yīng)用提供 GNSS 天線信息,請調(diào)用 hasGnssAntennaInfo()。
隱私注意事項(xiàng)
- GNSS 天線只能識別設(shè)備型號,而不能識別具體設(shè)備。
- 如需使用
GnssAntennaInfo類,必須具備ACCESS_FINE_LOCATION權(quán)限。
圖形
NDK 圖像解碼器
NDK ImageDecoder API 提供了一種標(biāo)準(zhǔn) API,供 Android C/C++ 應(yīng)用直接解碼圖像。應(yīng)用開發(fā)者不再需要使用框架 API(通過 JNI)或捆綁第三方圖像解碼庫。有關(guān)詳情,請參閱圖像解碼器開發(fā)者指南。
Frame rate API
Android 11 提供了一個 API,可讓應(yīng)用告知系統(tǒng)其預(yù)期幀速率,從而減少支持多個刷新率的設(shè)備上的抖動。有關(guān)如何使用此 API 的信息,請參閱幀速率指南。
請求并檢查低延時支持
特定的顯示屏可以執(zhí)行圖形后期處理,例如某些外部顯示屏和電視。此類后期處理改善了圖形質(zhì)量,但可能會增加延時。支持 HDMI 2.1 的新款顯示屏具有自動低延時模式(ALLM,也稱為游戲模式),該模式可以通過關(guān)閉后期處理以最大限度地縮短延時。如需詳細(xì)了解 ALLM,請參閱 HDMI 2.1 規(guī)范。
窗口可以請求使用自動低延時模式(如果可用)。ALLM 對于游戲和視頻會議等應(yīng)用特別有用,因?yàn)閷τ谶@些應(yīng)用而言,低延時的重要性要高于擁有最佳的圖形質(zhì)量。
如需開啟或關(guān)閉最低限度的后期處理,請調(diào)用 Window.setPreferMinimalPostProcessing(),或?qū)⒋翱诘?preferMinimalPostProcessing 屬性設(shè)置為 true。并非所有的顯示屏都支持最低限度的后期處理;如需了解某個顯示屏是否支持該功能,可調(diào)用新方法 Display.isMinimalPostProcessingSupported()。
注意:如果用戶停用最低限度的后期處理,或者顯示屏不支持低延時模式,那么調(diào)用 Window.setPreferMinimalPostProcessing() 不會有任何作用。
高性能圖形調(diào)試層注入
應(yīng)用現(xiàn)在可以將外部圖形層(GLES、Vulkan)加載到原生應(yīng)用代碼中,可以在不產(chǎn)生性能開銷的前提下,提供與可調(diào)試應(yīng)用相同的功能。在使用 GAPID 等工具對應(yīng)用進(jìn)行性能剖析時,此功能尤為重要。如需對應(yīng)用進(jìn)行性能剖析,只需要在應(yīng)用清單文件中添加以下元數(shù)據(jù)元素,而無需讓應(yīng)用變成可調(diào)試應(yīng)用:
<application ... >
<meta-data android:name="com.android.graphics.injectLayers.enable"
android:value="true" />
</application>
適用于 OpenGL ES 的 ANGLE
您可以使用 ANGLE 運(yùn)行非核心應(yīng)用以評估性能,并確定特定應(yīng)用是否應(yīng)使用 ANGLE,而不是原生 OpenGL ES 驅(qū)動程序。有關(guān)說明,請參閱使用適用于 OpenGL ES 的 ANGLE。
圖片和相機(jī)
在主動拍攝期間關(guān)閉通知提示音和振動
從 Android 11 開始,在主動使用相機(jī)時,您的應(yīng)用可以使用 setCameraAudioRestriction() 以僅關(guān)閉振動、同時關(guān)閉聲音和振動或都不關(guān)閉。
Android 模擬器中的相機(jī)支持?jǐn)U展
Android 11 改進(jìn)了Android 模擬器相機(jī)功能。添加的功能包括:
- RAW 捕獲
- YUV 重新處理
- 3 級設(shè)備
- 邏輯攝像頭支持
更好地支持包含多個幀的 HEIF 圖片
從 Android 11 開始,如果您調(diào)用 ImageDecoder.decodeDrawable() 并傳遞包含幀序列的 HEIF 圖片(如動畫或連拍照片),則該方法會返回包含整個圖片序列的 AnimatedImageDrawable。在較低版本的 Android 系統(tǒng)中,該方法會返回僅包含單個幀的 BitmapDrawable。
如果 HEIF 圖片包含的多個幀不在一個序列中,您可以通過調(diào)用 MediaMetadataRetriever.getImageAtIndex() 檢索各個幀。
無障礙功能
面向無障礙服務(wù)開發(fā)者的更新
如果您創(chuàng)建自定義無障礙服務(wù),可以在 Android 11 中使用以下功能:
- 在無障礙服務(wù)的面向用戶的解釋中,除了純文本之外,現(xiàn)在還允許使用 HTML 和圖片。這種靈活性可讓您更輕松地向最終用戶解釋您的服務(wù)有何功能以及對他們有何幫助。
- 如需使用比
contentDescription在語義上更有意義的界面元素的狀態(tài)說明,請調(diào)用getStateDescription()方法。 - 如需請求觸摸事件繞過系統(tǒng)的觸摸瀏覽器,請調(diào)用
setTouchExplorationPassthroughRegion()。同樣,如需請求手勢繞過系統(tǒng)的手勢檢測器,請調(diào)用setGestureDetectionPassthroughRegion()。 - 您可以請求 IME 操作(如“輸入”和“下一個”),以及不啟用
FLAG_SECURE標(biāo)記的窗口的屏幕截圖。
其他功能
應(yīng)用進(jìn)程退出原因
Android 11 引入了 ActivityManager.getHistoricalProcessExitReasons() 方法,用于報告近期任何進(jìn)程終止的原因。應(yīng)用可以使用此方法收集崩潰診斷信息,例如進(jìn)程終止是由于 ANR、內(nèi)存問題還是其他原因所致。此外,您還可以使用新的 setProcessStateSummary() 方法存儲自定義狀態(tài)信息,以便日后進(jìn)行分析。
getHistoricalProcessExitReasons() 方法會返回 ApplicationExitInfo 類的實(shí)例,該類包含與應(yīng)用進(jìn)程終止相關(guān)的信息。通過對此類的實(shí)例調(diào)用 getReason(),您可以確定應(yīng)用進(jìn)程終止的原因。例如,REASON_CRASH 的返回值表示應(yīng)用中發(fā)生了未處理的異常。如果應(yīng)用需要確保退出事件的唯一性,可以保留特定于應(yīng)用的標(biāo)識符,例如基于 getTimestamp() 方法的時間戳的哈希值。
資源加載器
歡迎您提供相關(guān)反饋!請?zhí)顚戇@份簡短的調(diào)查問卷,將您使用此功能的情況告知我們。特別是,請將受此功能影響的用例告知我們。
Android 11 引入了一個新 API,允許應(yīng)用動態(tài)擴(kuò)展資源的搜索和加載方式。新的 API 類 ResourcesLoader 和 ResourcesProvider 主要負(fù)責(zé)提供新功能。兩者協(xié)同作用,可以提供額外的資源,或修改現(xiàn)有資源的值。
ResourcesLoader 對象是向應(yīng)用的 Resources 實(shí)例提供 ResourcesProvider 對象的容器,而 ResourcesProvider 對象提供從 APK 和資源表加載資源數(shù)據(jù)的方法。
此 API 的一個主要用例是自定義資源加載。您可以將新 API 類 DirectoryAssetsProvider 的實(shí)例與 ResourcesProvider 配對,以重定向基于文件的資源的解析,這樣就只需搜索特定目錄,而無需搜索應(yīng)用 APK。您可以通過 AssetManager API 類中的 open() 系列方法訪問這些資源,就像訪問 APK 中綁定的資源一樣。
APK 簽名方案 v4
Android 11 添加了對 APK 簽名方案 v4 的支持。此方案會在單獨(dú)的文件 (apk-name.apk.idsig) 中生成一種新的簽名,但在其他方面與 v2 和 v3 類似。沒有對 APK 進(jìn)行任何更改。此方案支持 ADB 增量 APK 安裝,這樣會加快 APK 安裝速度。
動態(tài) intent 過濾器
如需接收 intent,應(yīng)用必須通過在其清單中定義 intent 過濾器,在編譯時聲明它能夠接收哪些類型的數(shù)據(jù)。在 Android 10 及更低版本中,應(yīng)用無法在運(yùn)行時更改其 intent 過濾器。這對于虛擬化應(yīng)用(如虛擬機(jī)和遠(yuǎn)程桌面)而言是一個問題,因?yàn)檫@些應(yīng)用無法確切得知用戶將在它們內(nèi)部安裝什么軟件。
Android 11 引入了 MIME 組,這是一個新的清單元素,可讓應(yīng)用在 intent 過濾器中聲明一組動態(tài)的 MIME 類型,并在運(yùn)行時以編程方式對其進(jìn)行修改。如需使用 MIME 組,請使用新的 android:mimeGroup 屬性在應(yīng)用清單中添加一個數(shù)據(jù)元素:
<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,用于在運(yùn)行時標(biāo)識 MIME 組。您可以通過將某個 MIME 組的 ID 傳遞給 PackageManager API 類中的以下新方法,訪問和更新該 MIME 組的內(nèi)容:
如果您以編程方式將 MIME 類型添加到 MIME 組,其運(yùn)作方式與清單中明確聲明的靜態(tài) MIME 類型完全相同。
注意:mimeGroup 字符串是基于每個軟件包定義的。在同一軟件包中,您可以在多個 intent 過濾器或組件中使用相同的 mimeGroup 字符串以聲明它們之間共享的 MIME 組。不同的軟件包不能共享 MIME 組,但它們可以使用相同的 mimeGroup 字符串,而不相互干擾。
自動填充增強(qiáng)功能
Android 11 改進(jìn)了自動填充服務(wù)。
AssistStructure.ViewNode 中的提示標(biāo)識符
對自動填充服務(wù)來說,根據(jù)視圖的屬性計算視圖的簽名哈希值通常很有用。在計算簽名哈希值時,視圖提示是一個非常值得參考的屬性,但提示字符串可能會隨著手機(jī)的語言區(qū)域而發(fā)生變化。為了解決此問題,Android 11 使用新的 getHintIdEntry() 方法擴(kuò)展了 AssistStructure.ViewNode,該方法會返回視圖提示文本的資源標(biāo)識符。此方法提供一個與語言區(qū)域無關(guān)的值,可用于計算簽名哈希值。
提供了數(shù)據(jù)集的事件
為了幫助自動填充服務(wù)提高建議內(nèi)容的質(zhì)量,Android 11 提供了一種方法以識別自動填充服務(wù)提供了數(shù)據(jù)集但用戶未選擇任何數(shù)據(jù)集的情況。在 Android 11 中,FillEventHistory 會報告一種新的 TYPE_DATASETS_SHOWN 事件類型。每當(dāng)自動填充服務(wù)向用戶提供一個或多個數(shù)據(jù)集時,FillEventHistory 就會記錄此類型的事件。自動填充服務(wù)可以將這些事件與現(xiàn)有的 TYPE_DATASET_SELECTED 事件結(jié)合使用來確定用戶是否選擇了任何提供的自動填充選項(xiàng)。