Android 11 为开发者引入了许多很棒的新功能和 API。以下部分将帮助您了解应用的功能并开始使用相关的 API。
有关新增、修改和删除 API 的详细列表,请阅读 API 差异报告。有关新 API 的详细信息,请访问 Android API 参考 - 新 API 会高亮显示以方便查看。此外,要了解平台更改可能影响您应用的领域,请务必查看 Android 11 行为更改 针对目标为 Android R 的应用 和 针对所有应用,以及 隐私更改。
新体验
设备控制
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 允许这些大型数据集使用共享数据块缓存在设备上。要详细了解如何共享数据集,请参阅 共享大型数据集的深入指南。
在 OTA 重新启动后无需用户凭据执行基于文件的加密
设备完成 OTA 更新并重新启动后,放置在凭据保护存储中的凭据加密密钥 (CE) 可立即用于 基于文件的加密 (FBE) 操作。这意味着,在 OTA 更新后,您的应用可以在用户输入其 PIN、图案或密码之前恢复需要 CE 密钥的操作。
性能和质量
无线调试
Android 11 支持通过 Android Debug Bridge (adb) 从工作站无线部署和调试您的应用。例如,您可以将可调试应用部署到多个远程设备,而无需通过 USB 物理连接设备,也无需处理常见的 USB 连接问题,例如驱动程序安装。有关更多信息,请参阅 在硬件设备上运行应用。
ADB 增量 APK 安装
在设备上安装大型 (2GB+) APK 可能需要很长时间,即使仅对应用进行了少量更改。ADB(Android Debug Bridge)增量 APK 安装通过安装足以启动应用的 APK 部分并在后台传输剩余数据来加快此过程。adb install
如果设备支持并且您安装了最新的 SDK 平台工具,则会自动使用此功能。如果不支持,则会静默使用默认安装方法。
使用以下 adb 命令 使用此功能。如果设备不支持增量安装,则命令将失败并打印详细说明。
adb install --incremental
在运行 ADB 增量 APK 安装之前,必须对 APK 进行签名并创建 APK 签名方案 v4 文件。此功能需要将 v4 签名文件放在 APK 旁边才能正常工作。
使用原生内存分配器进行错误检测
GWP-ASan 是一种原生内存分配器功能,有助于查找使用后释放和堆缓冲区溢出错误。您可以为应用的全局或特定子进程启用此功能。要了解更多信息,请参阅 GWP-Asan 指南。
神经网络 API 1.3
Android 11 扩展和改进了 神经网络 API (NNAPI)。
新操作
NNAPI 1.3 引入了一种新的操作数类型 TENSOR_QUANT8_ASYMM_SIGNED
,以支持 TensorFlow Lite 的新的量化方案。
此外,NNAPI 1.3 还引入了以下新的操作。
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
新的机器学习控件
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 热管理 API
当设备过热时,可能会降低 CPU 和/或 GPU 的频率,这可能会以意想不到的方式影响应用。包含复杂图形、大量计算或持续网络活动的应用或游戏更容易遇到问题。
使用 Android 11 中的 NDK 热管理 API 监控设备上的温度变化,然后采取措施以保持较低的功耗和更低的设备温度。此 API 类似于 Java 热管理 API;您可以使用它来接收任何热状态更改的通知,或直接轮询当前状态。
文本和输入
改进的 IME 转换
Android 11 引入了新的 API 来改进输入法编辑器 (IME)(例如屏幕键盘)的转换。这些 API 使您更容易根据 IME 的出现和消失以及状态栏和导航栏等其他元素调整应用的内容。
要在任何 EditText
获得焦点时显示 IME,请调用 view.getInsetsController().show(Type.ime())
。(您可以在与获得焦点的 EditText
相同层次结构中的任何视图上调用此方法,不必专门在 EditText
上调用它。)要隐藏 IME,请调用 view.getInsetsController().hide(Type.ime())
。您可以通过调用 view.getRootWindowInsets().isVisible(Type.ime())
检查 IME 当前是否可见。
要使应用的视图与 IME 的出现和消失同步,请通过向 View.setWindowInsetsAnimationCallback()
提供 WindowInsetsAnimation.Callback
在视图上设置侦听器。(您可以在任何视图上设置此侦听器,不必是 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; } });
要移动 IME 或其他系统栏,请调用控制器的 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
包更新为使用第 66 版的 ICU 库,而 Android 10 中使用的是第 63 版。新的库版本包含更新的 CLDR 地区数据以及对 Android 中国际化支持的许多增强功能。
新库版本中的显著更改包括以下内容
- 许多格式化 API 现在支持扩展
FormattedValue
的新返回对象类型。 LocaleMatcher
API 通过构建器类、对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 中的低延迟解码
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 对使用投射和 mediarouter API 的应用实现了新的行为。
除了从应用内访问投射选项外,切换选项还会出现在系统媒体播放器中。这有助于在用户在设备之间移动时(例如在厨房观看视频与在手机上观看视频,或在家中或汽车中收听音频)更改其观看和收听环境时,为用户提供无缝的体验。请参阅 输出切换器。
连接
Wi-Fi Passpoint 增强功能
有关 Android 11 中添加的 Passpoint 功能的信息,请参阅 Passpoint。
Wi-Fi 建议 API 扩展
Android 11 扩展了 Wi-Fi 建议 API 以增强应用的网络管理功能,包括以下内容
- 连接管理应用可以通过允许断开连接请求来管理自己的网络。
- Passpoint 网络已集成到建议 API 中,并且可以建议给用户。
- 分析 API 使您能够获取有关网络质量的信息。
CallScreeningService 更新
从 Android 11 开始,CallScreeningService 可以请求有关传入呼叫的 STIR/SHAKEN 验证状态 (verstat) 的信息。此信息作为传入呼叫的 呼叫详细信息 的一部分提供。
如果一个CallScreeningService
拥有READ_CONTACTS
权限,则当有来自用户联系人号码的来电或拨打用户联系人号码的去电时,系统会通知应用。
更多信息,请参阅防止主叫方 ID 欺骗。
开放移动 API 更新
有关 Android 11 及更高版本上 OMAPI 支持的信息,请参阅开放移动 API 阅读器支持。
高性能 VPN
针对 API 级别 30 及更高版本或在 API 级别 29 及更高版本上发布的设备上运行的应用可以将 IKEv2/IPsec 应用于用户配置的 VPN 和基于应用的 VPN。
VPN 在操作系统中本地运行,简化了在应用中建立 IKEv2/IPsec VPN 连接所需的代码。
每个进程的网络访问控制
有关基于每个进程启用网络访问的信息,请参阅管理网络使用情况。
允许使用相同 FQDN 的多个已安装的 Passpoint 配置
从 Android 11 开始,您可以使用PasspointConfiguration.getUniqueId()
获取PasspointConfiguration
对象的唯一标识符,这使您的应用用户能够安装具有相同完全限定域名 (FQDN) 的多个配置文件。
当运营商在其网络上部署多个移动国家代码 (MCC) 和移动网络代码 (MNC) 组合,但只有一个 FQDN 时,此功能非常有用。在 Android 11 及更高版本上,可以安装多个具有相同 FQDN 的配置文件,当用户安装具有任一 MCC 或 MNC 的 SIM 卡时,这些配置文件将与网络匹配作为家庭提供商。
GNSS 天线支持
Android 11 引入了GnssAntennaInfo
类,使您的应用能够更多地利用全球导航卫星系统 (GNSS) 可以提供的厘米级精度定位。
在有关天线校准信息的指南中了解更多信息。
图形
NDK 图像解码器
NDK ImageDecoder
API 为 Android C/C++ 应用提供了一个标准 API,用于直接解码图像。应用开发者不再需要使用框架 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 模拟器中扩展的相机支持
有关从 Android 11 开始模拟器中相机扩展支持的信息,请参阅相机支持。
支持同时使用多个相机
Android 11 添加了 API 以查询同时使用多个相机的支持,包括前置摄像头和后置摄像头。
要检查您的应用正在运行的设备上的支持情况,请使用以下方法
getConcurrentCameraIds()
返回一个Set
,其中包含可以与相同应用进程配置时保证的流组合同时流式传输的相机 ID 组合。isConcurrentSessionConfigurationSupported()
查询相机设备是否可以同时支持相应的会话配置。
更好地支持包含多个帧的 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
表示应用中发生了未处理的异常。如果您的应用需要确保退出事件的唯一性,它可以维护一个应用特定的标识符,例如基于getTimestamp()
方法的时间戳的哈希值。
其他资源
更多信息,请阅读 Medium 上关于 使应用更私密和稳定的新 Android 11 工具 的文章。
资源加载器
Android 11 引入了一个新的 API,允许应用动态扩展资源搜索和加载方式。新的 API 类 ResourcesLoader
和 ResourcesProvider
主要负责提供新的功能。它们共同提供了提供额外资源和资产或修改现有资源和资产值的能力。
ResourcesLoader
对象是容器,它们向应用的 Resources
实例提供 ResourcesProvider
对象。反过来,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 组。您可以通过将其 ID 传递给 PackageManager
API 类中的以下新方法来访问和更新 MIME 组的内容。
以编程方式将 MIME 类型添加到 MIME 组时,其功能与在清单中显式声明的静态 MIME 类型完全相同。
自动填充增强功能
Android 11 引入了对自动填充服务的改进。
AssistStructure.ViewNode 中的提示标识符
对于自动填充服务来说,根据视图的属性计算视图的签名哈希通常很有用。 视图提示 是计算签名哈希时包含的特别好的属性,但提示字符串可能会随着手机的区域设置而改变。为了解决此问题,Android 11 通过新的 getHintIdEntry()
方法扩展了 AssistStructure.ViewNode
,该方法返回视图提示文本的资源标识符。此方法提供了一个与区域设置无关的值,您可以使用它来计算签名哈希。
显示数据集事件
为了帮助自动填充服务改进其建议,Android 11 提供了一种方法来识别自动填充服务呈现数据集但用户未选择任何数据集的情况。在 Android 11 中,FillEventHistory
报告了一个新的 TYPE_DATASETS_SHOWN
事件类型。FillEventHistory
在自动填充服务向用户呈现一个或多个数据集时记录此类型的事件。自动填充服务可以将这些事件与现有的 TYPE_DATASET_SELECTED
事件结合使用,以确定用户是否选择了任何提供的自动填充选项。
IME 集成
键盘和其他 IME 现在可以在内联、建议栏或类似界面中显示自动填充建议,而不是在下拉菜单中。为了保护密码和信用卡号等敏感信息,建议会显示给用户,但在用户选择其中一个之前,IME 无法知道这些建议。有关 IME 和密码管理器如何支持此功能的信息,请参阅 将自动填充与键盘集成。
与内容捕获服务共享数据
从 Android 11 开始,您的应用可以与设备的内容捕获服务共享数据。此功能使设备更容易提供上下文智能,例如显示当前在用户环境中播放的歌曲的名称。
若要使应用中的数据可供内容捕获服务使用,请在 ContentCaptureManager
的实例上调用 shareData()
方法。如果系统接受数据共享请求,您的应用将收到一个只写文件描述符,以便与内容捕获服务共享。