Al igual que las versiones anteriores, Android 15 incluye cambios de comportamiento que podrían afectar a tu app. Los siguientes cambios se aplican exclusivamente a las apps orientadas a Android 15 o versiones posteriores. Si tu app está orientada a Android 15 o versiones posteriores, debes modificarla para que admita estos comportamientos correctamente, cuando corresponda.
Asegúrate de revisar también la lista de cambios de comportamiento que afectan a todas las apps que se ejecutan en Android 15, independientemente de la targetSdkVersion
de tu app.
Funcionalidad principal
Android 15 modifica o expande varias capacidades principales del sistema Android.
Cambios en los servicios en primer plano
我们将对 Android 15 中的前台服务做出以下更改。
新增媒体处理前台服务类型
Android 15 introduces a new foreground service type, mediaProcessing
. This
service type is appropriate for operations like transcoding media files. For
example, a media app might download an audio file and need to convert it to a
different format before playing it. You can use a mediaProcessing
foreground
service to make sure the conversion continues even while the app is in the
background.
For more information about the mediaProcessing
service type, see Changes to
foreground service types for Android 15.
对启动前台服务的 BOOT_COMPLETED
广播接收器的限制
针对启动前台服务的 BOOT_COMPLETED
广播接收器存在新的限制。BOOT_COMPLETED
接收器不能启动以下类型的前台服务:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(从 Android 14 开始,系统针对microphone
实施了此限制)
如果 BOOT_COMPLETED
接收器尝试启动任何此类前台服务,系统会抛出 ForegroundServiceStartNotAllowedException
。
Experiencia del usuario
Android 15 incluye algunos cambios destinados a crear una experiencia del usuario más intuitiva y coherente.
Cambios en la inserción de ventana
Android 15 中即将推出与窗口边衬区相关的两项变更。在 Beta 版 1 中,将强制执行无边框模式。还有即将生效的配置变更,包括系统栏的默认配置。
全面强制执行
默认情况下,如果应用以 Android 15 为目标平台,则在搭载 Android 15 的设备上会无边框。
这是一项重大变更,可能会对应用的界面产生负面影响。变更如下:
- 手势手柄导航栏
- 默认为透明。
- 由于底部偏移已停用,因此内容绘制在系统导航栏后面,除非应用边衬区。
setNavigationBarColor
和R.attr#navigationBarColor
已废弃,不会影响手势导航。setNavigationBarContrastEnforced
和R.attr#navigationBarContrastEnforced
仍然对手势导航没有影响。
- “三按钮”导航
- 不透明度默认设置为 80%,颜色可能与窗口背景匹配。
- 已停用底部偏移,因此内容绘制在系统导航栏后面,除非应用边衬区。
- 默认情况下,
setNavigationBarColor
和R.attr#navigationBarColor
设置为与窗口背景匹配。窗口背景必须是彩色可绘制对象,才能应用此默认设置。此 API 已废弃,但会继续影响三按钮导航。 setNavigationBarContrastEnforced
和R.attr#navigationBarContrastEnforced
默认情况下为 true,这会在“三按钮”导航中添加 80% 的不透明背景。
- 状态栏
- 默认为透明。
- 顶部偏移量已停用,因此,除非应用边衬区,否则内容将绘制在状态栏后面。
setStatusBarColor
和R.attr#statusBarColor
已废弃,对 Android 15 没有任何影响。setStatusBarContrastEnforced
和R.attr#statusBarContrastEnforced
已废弃,但在 Android 15 上仍产生影响。
- 刘海屏
- 非浮动窗口的
layoutInDisplayCutoutMode
必须为LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
。否则应用将崩溃并抛出 IllegalArgumentException。“ALWAYS”是唯一允许使用的选项,这样用户就不会在横屏模式下看到由刘海屏导致的黑色条,因此不会出现屏幕边缘与屏幕边缘相同的黑边。
- 非浮动窗口的
以下示例展示了以 Android 15 为目标平台之前和之后以及应用边衬区前后的应用。
如果您的应用:
- 已 无边框并应用了边衬区,那么除了以下几种场景外,您基本上不受影响。不过,即使您认为自己不受影响,我们也建议您测试自己的应用。
- 您的应用之所以崩溃,是因为您有一个非浮动窗口,例如 activity 使用
SHORT_EDGES, NEVER
或DEFAULT
,而非LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
。如果您的应用在启动时崩溃,这可能是由于启动画面所致。在提供修复程序之前,请设置window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
。 - 在流量较低的屏幕上,可能会出现界面被遮挡的屏幕。验证这些访问较少的屏幕没有被遮挡的界面。流量较低的屏幕包括:
- 初始配置或登录屏幕
- “设置”页面
- 您的应用之所以崩溃,是因为您有一个非浮动窗口,例如 activity 使用
- 非无边际,那么您很有可能受到影响。除了无边框应用出现的情况之外,您还需要考虑以下因素:
- 如果您的应用使用 Material 3 组件(Compose 中的 androidx.compose.material3,例如
TopAppBar, BottomAppBar
和NavigationBar
),这些组件可能不受影响,因为它们会自动处理边衬区。 - 如果您的应用使用的是 Material 2 组件(Compose 中的 androidx.compose.material),则这些组件不会自动处理边衬区。不过,您可以访问边衬区并手动应用边衬区。在 androidx.compose.material 1.6.0 及更高版本中,请使用 windowInsets 参数,为
BottomAppBar
、TopAppBar
、BottomNavigation
和NavigationRail
手动应用边衬区。同样,对Scaffold
使用contentWindowInsets
参数。 - 如果您的应用使用 View 和 Material 组件 (com.google.android.material),则大多数基于 View 的 Material 组件(例如
BottomNavigationView
、BottomAppBar
、NavigationRailView
或NavigationView
)会处理边衬区,无需执行额外的操作。不过,如果使用AppBarLayout
,则需要添加android:fitsSystemWindows="true"
。 - 对于自定义可组合项,请手动应用边衬区作为内边距。如果您的内容位于 Scaffold 内,您可以使用 Scaffold 的内边距值使用边衬区。否则,请使用
WindowInsets
之一应用内边距。 - 如果您的应用使用的是 View 和 BottomSheet、SideSheet 或自定义容器,请使用
ViewCompat.setOnApplyWindowInsetsListener
应用内边距。对于 RecyclerView,请使用此监听器应用内边距,并添加clipToPadding="false"
。
- 如果您的应用使用 Material 3 组件(Compose 中的 androidx.compose.material3,例如
- 必须为三按钮导航或状态栏提供自定义背景保护,那么您的应用应使用
WindowInsets.Type#tappableElement()
获取三按钮导航栏高度或WindowInsets.Type#statusBars
,将可组合项或视图放置在系统栏后面。
如需了解应用边衬区的其他注意事项,请参阅边缘视图和 Edge to Edge Compose 指南。
已废弃和已停用的 API 列表如下:
- R.attr#statusBarColor
- R.attr#navigationBarColor
- R.attr#navigationBarDividerColor
- 窗口#setDecorFitsSystemWindows
- 窗口#setStatusBarColor
- 窗口#setStatusBarContrastEnforced
- 窗口#setNavigationBarColor
- Window#setNavigationBarDividerColor
- 窗口#getStatusBarColor
- Window#getStatusBarContrastEnforced
- 窗口#getNavigationBarColor
- Window#getNavigationBarDividerColor
稳定配置
此变更无法在 Beta 1 中进行测试,但很快就会推出。
如果您的应用以 Android 15 或更高版本为目标平台,Configuration
将不再排除系统栏。如果您在 Configuration
类中使用屏幕尺寸计算布局,则应根据需要将其替换为合适的 ViewGroup
、WindowInsets
或 WindowMetricsCalculator
等更好的替代方案。
从 API 1 开始,Configuration
一直可用。它通常从 Activity.onConfigurationChanged
获取。它可提供窗口密度、方向和大小等信息。从 Configuration
返回的窗口大小的一个重要特征是它之前排除了系统栏。
配置大小通常用于资源选择(如 /res/layout-h500dp
),这仍然是一个有效的用例。不过,我们一直不建议将其用于布局计算。如果这样做,您应该立即离开。您应该根据自己的使用场景,将 Configuration
替换为更合适的代码。
如果您使用它来计算布局,请使用适当的 ViewGroup
,例如 CoordinatorLayout
或 ConstraintLayout
。如果您使用它来确定系统导航栏的高度,请使用 WindowInsets
。如果您想知道应用窗口的当前大小,请使用 computeCurrentWindowMetrics
。
以下列表介绍了受此更改影响的字段:
Configuration.screenWidthDp
和screenHeightDp
尺寸不再排除系统栏。Configuration.smallestScreenWidthDp
会受到screenWidthDp
和screenHeightDp
更改的间接影响。- 在近方形设备上,对
screenWidthDp
和screenHeightDp
的更改会间接影响Configuration.orientation
。 Display.getSize(Point)
会受到配置变更的间接影响。从 API 级别 30 开始,此 API 已被废弃。- 从 API 级别 33 开始,
Display.getMetrics()
就一直以这种方式运行。
El atributo eleganteTextHeight se establece en verdadero de forma predeterminada.
对于以 Android 15 为目标平台的应用,elegantTextHeight
TextView
属性默认变为 true
,将默认使用的紧凑字体替换为一些具有较大垂直指标的脚本,并且这种字体更易于阅读。紧凑字体的引入是为了防止破坏布局;Android 13(API 级别 33)允许文本布局利用 fallbackLineSpacing
属性拉伸垂直高度,以防止许多此类破坏。
在 Android 15 中,紧凑字体仍保留在系统中,因此您的应用可以将 elegantTextHeight
设置为 false
,以获得与之前相同的行为,但即将在未来版本中提供支持。因此,如果您的应用支持以下文字:阿拉伯语、老挝语、缅甸、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语,请将 elegantTextHeight
设置为 true
,以测试应用。
Cámara y contenido multimedia
En Android 15, se realizan los siguientes cambios en el comportamiento de la cámara y el contenido multimedia para las apps orientadas a Android 15 o versiones posteriores.
Restricciones para solicitar foco de audio
Apps that target Android 15 must be the top app or running an
audio-related foreground service in order to request audio focus. If an app
attempts to request focus when it does not meet one of these requirements, the
call returns AUDIOFOCUS_REQUEST_FAILED
.
A foreground service is considered audio-related if its type is
mediaPlayback
, camera
, microphone
, or phoneCall
.
You can learn more about audio focus at Manage audio focus.
Actualización de restricciones que no pertenecen al SDK
Android 15 包含更新后的受限非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 15 为目标平台,其中一些变更可能不会立即对您产生影响。不过,虽然您的应用可以访问某些非 SDK 接口(具体取决于应用的目标 API 级别),但使用任何非 SDK 方法或字段始终存在导致应用出问题的显著风险。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用进行确认。如果您的应用依赖于非 SDK 接口,则应开始计划迁移到 SDK 替代方案。不过,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的功能找到无需使用非 SDK 接口的替代方案,则应请求新的公共 API。
如需详细了解此 Android 版本中的变更,请参阅 Android 15 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制。