
Android 12 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android 12 上运行的 所有应用 ,无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更。
此外,请务必查看 仅影响以 Android 12 为目标平台的应用的行为变更 列表。
在搭载 Android 12 及更高版本的设备上, 滚动事件 的视觉行为发生了变化。
在 Android 11 及更低版本中,滚动事件会使视觉元素发光。在 Android 12 及更高版本中,发生拖动事件时,视觉元素会拉伸和反d;发生快速滑动事件时,它们会快速滑动和反d。
如需了解详情,请参阅 动画演示滚动手势 指南。
如果您之前在 Android 11 或更低版本中实现了自定义启动画面,则需要将您的应用迁移到 SplashScreen API,以确保它从 Android 12 开始正确显示。如果不迁移您的应用,则可能会导致应用启动体验变差或出乎预期。
如需了解相关说明,请参阅 将现有的启动画面实现迁移到 Android 12 。
此外,从 Android 12 开始,在所有应用的 冷启动 和 温启动 期间,系统始终会应用新的 Android 系统默认启动画面 。 默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground (如果是单色)构成。
如需了解详情,请参阅 启动画面开发者指南 。
从 Android 12(API 级别 31)开始,仅当您的应用获准处理某个通用网络 intent 中包含的特定网域时,该网络 intent 才会解析为应用中的 activity。如果您的应用未获准处理相应的网域,则该网络 intent 会解析为用户的默认浏览器应用。
应用可通过执行以下某项 *** 作来获准处理相应的网域:
如果您的应用调用网络 intent,不妨考虑添加一个提示或对话框,要求用户确认 *** 作。
Android 12 整合了现有行为,让用户可以 在沉浸模式下更轻松地执行手势导航命令 。此外,Android 12 还为 粘性沉浸模式提供了向后兼容性行为 。
Android 设备有许多不同的外形规格,如大屏设备、平板电脑和可折叠设备。为了针对每种设备适当地呈现内容,您的应用需要确定屏幕或显示屏尺寸。随着时间的推移,Android 提供了不同的 API 来检索这些信息。在 Android 11 中,我们引入了 WindowMetrics API 并废弃了以下方法:
在 Android 12 中,我们继续建议使用 WindowMetrics ,并且正在逐步废弃以下方法:
为了缓解应用使用 Display API 检索应用边界的行为,Android 12 限制了 API 为不完全可调整大小的应用返回的值。这可能会对将此信息与 MediaProjection 一起使用的应用产生影响。
应用应使用 WindowMetrics API 查询其窗口的边界,并使用 ConfigurationdensityDpi 查询当前的密度。
为了与较低的 Android 版本实现更广泛的兼容性,您可以使用 Jetpack WindowManager 库,它包含一个 WindowMetrics 类,该类支持 Android 40(API 级别 14)及更高版本。
首先,确保应用的 activity 完全可调整大小 。
activity 应依赖于来自 activity 上下文的 WindowMetrics 来执行任何与界面相关的工作,尤其是 WindowManagergetCurrentWindowMetrics() 或 Jetpack 的 WindowMetricsCalculatorcomputeCurrentWindowMetrics() 。
如果您的应用创建了 MediaProjection ,则必须正确地调整边界的大小,因为投影会捕获运行投影仪应用的显示分区。
如果应用完全可调整大小,则 activity 上下文会返回正确的边界,如下所示:
如果应用并非完全可调整大小,则它必须从 WindowContext 实例进行查询,并使用 WindowManagergetMaximumWindowMetrics() 或 Jetpack 方法 WindowMetricsCalculatorcomputeMaximumWindowMetrics() 检索 activity 边界的 WindowMetrics 。
注意 :任何使用 MediaProjection 的库也应遵循这些建议,并查询相应的 WindowMetrics 。
Android 12 将多窗口模式作为标准行为。
在大屏设备 (sw >= 600dp) 中,所有应用都将在多窗口模式下运行,无论应用配置为何。如果 resizeableActivity="false" ,应用会在必要时进入兼容模式,以适应显示屏尺寸。
在小屏设备 (sw < 600dp) 中,系统会检查 activity 的 minWidth 和 minHeight ,来确定 activity 能否在多窗口模式下运行。如果 resizeableActivity="false" ,则无论最小宽度和高度如何,应用都无法在多窗口模式下运行。
如需了解详情,请参阅 多窗口模式支持 。
相机应用通常假定设备的屏幕方向和相机预览的宽高比呈固定关系。但是,大屏设备类型(例如可折叠设备)和显示模式(例如多窗口和多屏幕)挑战着这一假设。
在 Android 12 上,请求特定屏幕方向且不可调整大小 ( resizeableActivity="false" ) 的相机应用会自动进入边衬区人像模式,从而确保相机预览的屏幕方向和宽高比正确。在可折叠设备和其他具有相机硬件抽象层 ( HAL ) 的设备上,会对相机输出应用额外的旋转以补偿相机传感器方向,并会剪裁相机输出以匹配应用相机预览的宽高比。无论设备屏幕方向如何以及设备是处于折叠状态还是展开状态,剪裁和额外的旋转可确保应用正确呈现相机预览。
除了 一些例外情况 之外,为了为短时间运行的 前台服务 提供流畅体验,搭载 Android 12 或更高版本的设备可以将前台服务通知的显示延迟 10 秒。此更改使某些短期任务可在显示通知之前完成。
Android 11(API 级别 30)引入了 受限存储分区 作为应用待机模式存储分区。从 Android 12 开始,此存储分区默认处于活跃状态。在所有存储分区中,受限存储分区的优先级最低(限制最高)。存储分区按优先级从高到低的顺序排列如下:
除了使用模式之外,系统还会考虑应用的行为,以决定是否要将您的应用放在受限存储分区中。
如果您的应用更负责地使用系统资源,就不太可能被放在受限存储分区中。此外,如果用户直接与您的应用互动,系统会将其放在一个限制较少的存储分区中。
如需检查系统是否已将您的应用放在受限存储分区中,请调用 getAppStandbyBucket() 。如果此方法的返回值为 STANDBY_BUCKET_RESTRICTED ,则您的应用在受限存储分区中。
如需测试您的应用在系统将其放在受限存储分区中时的行为,您可以手动将您的应用移至该存储分区。为此,请在终端窗口中运行以下命令:
在搭载 Android 12 或更高版本的受支持设备上,用户可以通过按一个切换开关选项,为设备上的所有应用启用和停用摄像头和麦克风使用权限。用户可以从 快捷设置 访问可切换的选项(如图 1 所示),也可以从系统设置中的“隐私设置”屏幕访问。
详细了解这些 切换开关 以及如何检查您的应用是否遵循了关于 CAMERA 和 RECORD_AUDIO 权限的最佳实践。
在搭载 Android 12 或更高版本的设备上,当应用使用麦克风或相机时,图标会出现在状态栏中。
详细了解这些 指标 以及如何检查您的应用是否遵循了关于 CAMERA 和 RECORD_AUDIO 权限的最佳实践。
[上传中(image-bd519-1643780883994-1)]
<figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;"> 图 1 “快捷设置”中的麦克风和摄像头切换开关。</figcaption>
[上传中(image-f49bfd-1643780883994-0)]
<figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;"> 图 2 麦克风和摄像头指示标志,显示了最近的数据访问。</figcaption>
在搭载 Android 12 或更高版本的设备上,根据应用对其他应用的 软件包可见性 ,以 Android 11(API 级别 30)或更高版本为目标平台且调用以下某种方法的应用会收到一组过滤后的结果:
Android 12 移除了之前弃用的加密算法的许多 BouncyCastle 实现,包括所有 AES 算法。系统改用这些算法的 Conscrypt 实现。
如果符合以下任何条件,则此变更会影响您的应用:
在 Android 12 及更高版本中,当某个应用首次调用 getPrimaryClip() 以 从另一个应用访问剪辑数据 时,会d出一个消息框消息,通知用户对剪贴板的访问。
消息框消息内的文本包含以下格式: <var translate="no" style="box-sizing: inherit; color: var(--devsite-var-color); -webkit-font-smoothing: auto; font-weight: 500;">APP</var> pasted from your clipboard
注意 :您的应用可能会调用 getPrimaryClipDescription() 以接收有关 剪贴板上当前数据的信息 。当您的应用调用此方法时,系统不会显示消息框消息。
在 Android 12 及更高版本中, getPrimaryClipDescription() 可以检测到以下详细信息:
为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ACTION_CLOSE_SYSTEM_DIALOGS intent *** 作。除了 一些特殊情况 之外,当应用尝试 调用包含此 *** 作的 intent 时,系统会基于应用的目标 SDK 版本执行以下 *** 作之一:
在以下情况下,应用仍然可以在 Android 12 或更高版本上关闭系统对话框:
为了维持系统安全并保持良好的用户体验,Android 12 会阻止应用使用 触摸事件 ,使用触摸事件时叠加层会以不安全的方式遮掩应用。 换言之,系统会屏蔽穿透某些窗口的触摸 *** 作,但 有一些例外情况 。
此变更会影响选择让触摸 *** 作穿透其窗口的应用,例如使用 FLAG_NOT_TOUCHABLE 标志。包括但不限于以下示例:
在以下情况下,允许执行“穿透”触摸 *** 作:
如果系统屏蔽触摸 *** 作, Logcat 会记录以下消息:
在搭载 Android 12 或更高版本的设备上,不受信任的触摸功能默认被屏蔽。如需允许不受信任的触摸 *** 作,请在终端窗口中运行以下 ADB 命令 :
如需将行为还原为默认设置(不受信任的触摸 *** 作被屏蔽),请运行以下命令:
Android 12 更改了在按下“返回”按钮时系统对为其任务根的启动器 activity 的默认处理方式。在以前的版本中,系统会在按下“返回”按钮时完成这些 activity。在 Android 12 中,现在系统会将 activity 及其任务移到后台,而不是完成 activity。当使用主屏幕按钮或手势从应用中导航出应用时,新行为与当前行为一致。
注意 :系统仅会将新行为应用于为其任务根的启动器 activity,即使用 ACTION_MAIN 和 CATEGORY_LAUNCHER 声明 intent 过滤器 的 activity。对于其他 activity,在按下“返回”按钮时,系统会像以前一样完成 activity。
对于大多数应用而言,此变更意味着使用“返回”按钮退出应用的用户可以更快地从 温状态 恢复应用,而不必从 冷状态 完全重启应用。
建议您针对此变更测试您的应用。如果您的应用目前替换 onBackPressed() 来处理返回导航并完成 Activity ,请更新您的实现来调用 superonBackPressed() 而不是完成 Activity。调用 superonBackPressed() 可在适当时将 activity 及其任务移至后台,并可为不同应用中的用户提供更一致的导航体验。
另请注意,通常,我们建议您使用 AndroidX Activity API 提供自定义返回导航 ,而不是替换 onBackPressed() 。如果没有组件拦截系统按下“返回”按钮,AndroidX Activity API 会自动遵循适当的系统行为。
在 Android 12 中,无论显示屏是否支持无缝过渡到新的刷新率,都会发生使用 setFrameRate() 实现的刷新率变化;无缝过渡是指没有任何视觉中断,比如一两秒钟的黑屏。以前,如果显示屏不支持无缝过渡,它在调用 setFrameRate() 后通常会继续使用同一刷新率。您可以调用 getAlternativeRefreshRates() 来提前确定向新刷新率的过渡是否有可能是无缝过渡。通常,会在刷新率切换完成后调用回调 onDisplayChanged() ,但对于某些外接显示屏,会在非无缝过渡期间调用该回调。
以下示例说明了您可以如何实现此行为:
Android 12 中添加了以下 API:
如需创建 Passpoint 建议,应用必须使用 PasspointConfiguration 、 Credential 和 HomeSp 类。这些类描述了 Wi-Fi Alliance Passpoint 规范 中定义的 Passpoint 配置文件。
如需了解详情,请参阅 适用于互联网连接的 Wi-Fi 建议 API 。
Android 12 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 12 为目标平台,其中一些变更可能不会立即对您产生影响。然而,虽然您目前仍可以使用一些非 SDK 接口( 具体取决于应用的目标 API 级别 ),但只要您使用任何非 SDK 方法或字段,终归存在导致应用出问题的显著风险。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以 测试您的应用 来进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应 请求新的公共 API 。
如需详细了解此 Android 版本中的变更,请参阅 Android 12 中有关限制非 SDK 接口的更新 。如需全面了解有关非 SDK 接口的详细信息,请参阅 对非 SDK 接口的限制 。
把项目的 theme 的 parent 指向 QMUICompat,至此,QMUI 可以正常工作。你可以通过在项目中的 theme 中用
的形式来覆盖 QMUI 组件的默认表现。具体可指定的属性名请参考 @style/QMUICompat 中的属性。
对 Button 提供圆角功能,支持以下特性:
1指定圆角的大小。
2分别指定不同方向的圆角大小。
3指定圆角的大小为高度的一半,并跟随高度变化自适应圆角大小。
4支持分别指定背景色和边框色,指定颜色时支持使用 color 或 ColorStateList。
提供了一系列常用的对话框,解决了使用系统默认对话框时在不同 Android 版本上的表现不一致的问题。使用不同的 Builder 来构建不同类型的对话框,这些 Builder 都拥有设置 title 和添加底部按钮的功能,不同的 Builder 特有的作用如下:
1MessageDialogBuilder: 消息类型的对话框 Builder。通过它可以生成一个带标题、文本消息、按钮的对话框。
2ConfirmMessageDialogBuilder: 带 Checkbox 的消息确认框 Builder。
3EditTextDialogBuilder: 带输入框的对话框 Builder。
4MenuDialogBuilder: 菜单对话框 Builder。
5CheckableDialogBuilder: 单选类型的对话框 Builder。
6MultiCheckableDialogBuilder: 多选类型的对话框 Builder。
7CustomDialogBuilder: 自定义对话框内容区域的 Builder。
8AutoResizeDialogBuilder: 随键盘升降自动调整 Dialog 高度的 Builder
类似 CSS 里 float: left 的浮动布局,从左到右排列子 View 并自动换行。支持以下特性:
1控制子 View 之间的垂直/水平间距。
2控制子 View 的水平对齐方向(左对齐/居中/右对齐)。
3限制子 View 的个数或行数。
通用的空界面控件,支持显示 loading、主标题和副标题、。
用于横向多个 Tab 的布局,包含多个特性:
1可以用 xml 或 QMUITabSegment 提供的 set 方法统一配置文字颜色、icon 位置、是否要下划线等。
2每个 Tab 都可以非常灵活的配置,内容上支持文字和 icon 的显示,icon 支持选中态,支持内容的排版对齐方向设置,支持显示红点,3支持插入自定义的 View,支持监听双击事件等。
4可以通过 setupWithViewPager(ViewPager) 方法与 ViewPager 绑定。
一个进度条控件,通过颜色变化显示进度,支持环形和矩形两种形式,主要特性如下:
1支持在进度条中以文字形式显示进度,支持修改文字的颜色和大小。
2可以通过 xml 属性修改进度背景色,当前进度颜色,进度条尺寸。
3支持限制进度的最大值。
通用的列表,常用于 App 的设置界面,注意其父类不是 ListView 而是 LinearLayout,所以一般要配合 ScrollView 使用。提供了 Section 的概念,用来将列表分块。 配合 QMUIGroupListViewSection, QMUICommonListItemView 和 QMUIGroupListSectionHeaderFooterView 使用。
提供一个浮层展示在屏幕中间,提供了以下两种样式:
1使用 QMUITipDialogBuilder 生成,提供了一个图标和一行文字的样式, 其中图标有 Loading、成功、失败等类型可选。
2使用 QMUITipDialogCustomBuilder 生成,支持传入自定义的 layoutResId。
提供为添加圆角、边框、剪裁到圆形或其他形状等功能。
在 TextView 的基础上支持文字竖排。
下拉刷新控件。支持自定义 RefreshView(表示正在刷新的 View),触发刷新的位置等特性。
提供一个浮层,支持自定义浮层的内容,支持在指定 View 的任一方向旁边展示该浮层,支持自定义浮层出现/消失的动画。
相比 TextView,修正了两个常见问题:
修正了 TextView 与 ClickableSpan 一起使用时,点击 ClickableSpan 也会触发 TextView 的事件的问题。
修正了 TextView 默认情况下如果添加了 ClickableSpan 之后就无法把点击事件传递给 TextView 的 Parent 的问题。
使 TextView 能自动识别 URL、电话、邮箱地址,相比 TextView 有以下特点:
1可以设置链接的样式。
2可以设置链接的点击事件。
1支持显示表情的伪 TextView(继续自定义 View,而不是真正的 TextView), 实现了 TextView 的 maxLine、ellipsize、textSize、textColor 等基本功能。
2支持与 QMUITouchableSpan 配合使用实现内容可点击。
支持二级结构的列表的折叠与展开;支持滚动时悬浮当前 section header; 支持在section list 或 section item list 前后添加自定义 View。
对 QMUITopBar 的包裹类,并代理了 QMUITopBar 的方法。配合 QMUIWindowInsetLayout 使用,可使 QMUITopBar 在支持沉浸式状态栏的界面中顶部延伸到状态栏。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)