查看原文
其他

Jetpack WindowManager 1.1 稳定版

Android Android 开发者
2024-07-19
作者 / Android 开发者关系工程师 Francesco Romano


自 Jetpack WindowManager 1.0 稳定版发布的一年多以来,可折叠设备和大屏设备领域发生了诸多变化。许多新款设备都已进入市场,大量新用例也已解锁!

Jetpack WindowManager 库在帮助您优化您的 Android 应用上发挥重要作用,使其能够适用于不同的设备类型。并且此版本还包含多项新功能和改进,是一个重大的里程碑式进展。

让我们来回顾一下 Jetpack WindowManager 库涵盖的所有用例。



获取窗口指标 (和大小类别!)



过去,开发者通过设备显示尺寸来决定其应用布局,但随着不同设备类型 (如可折叠设备) 和显示模式 (如多窗口模式和多显示屏模式) 的出现,了解应用窗口的大小而不是设备的显示尺寸变得至关重要。

Jetpack WindowManager WindowMetricsCalculator 界面可以提供可靠的数据来源,以帮助您衡量当前可用于显示您应用的屏幕空间。


  • WindowMetricsCalculator
    https://developer.android.google.cn/reference/kotlin/androidx/window/layout/WindowMetricsCalculator


在此基础上,窗口大小类别是一组视口划分点,有助于您设计、开发和测试响应式和自适应应用布局。此类划分点专门用于平衡布局的简单性和灵活性,以便针对特殊情况优化您的应用。


  • 窗口大小类别

    https://developer.android.google.cn/guide/topics/large-screens/support-different-screen-sizes#window_size_classes


对于基于 View 的应用,您可以使用以下代码段来计算窗口大小类别: 

private fun computeWindowSizeClasses() { val metrics = WindowMetricsCalculator.getOrCreate() .computeCurrentWindowMetrics(this) val width = metrics.bounds.width() val height = metrics.bounds.height() val density = resources.displayMetrics.density val windowSizeClass = WindowSizeClass.compute(width/density, height/density)
// use windowSizeClass.windowHeightSizeClass and windowSizeClass.windowWidthSizeClass}

您可以参阅 "支持不同屏幕尺寸" 开发者指南了解详细信息。


  • 支持不同屏幕尺寸
    https://developer.android.google.cn/guide/topics/large-screens/support-different-screen-sizes



让应用能够感知折叠



Jetpack WindowManager 还提供优化可折叠设备布局所需的所有 API。

具体而言,您可以使用 WindowInfoTracker 查询 FoldingFeature 信息,如
  • 状态: 设备的折叠状态: FLATHALF_OPENED

  • 方向: 折叠或设备合页的方向: HORIZONTALVERTICAL
  • 遮挡类型: 折叠或合页是否遮挡部分显示屏: NONEFULL
  • 是否分离: 折叠或合页是否创建了两个逻辑显示区域: true 或 false
  • 边界: 应用窗口内功能的边界矩形 (继承自 DisplayFeature)

  • WindowInfoTracker
    https://developer.android.google.cn/reference/kotlin/androidx/window/layout/WindowInfoTracker
  • FoldingFeature
    https://developer.android.google.cn/reference/androidx/window/layout/FoldingFeature
  • DisplayFeature
    https://developer.android.google.cn/reference/androidx/window/layout/DisplayFeature#getBounds%28%29

您可以通过 Flow 访问这些数据: 

override fun onCreate(savedInstanceState: Bundle?) { ... lifecycleScope.launch(Dispatchers.Main) { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { WindowInfoTracker.getOrCreate(this@MainActivity) .windowLayoutInfo(this@MainActivity) .collect { layoutInfo -> // New posture information val foldingFeature = layoutInfo.displayFeatures // use the folding feature to update the layout } } }}
  • Flow
    https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/


一旦收集到 FoldingFeature 信息,您便可以使用这些数据为当前设备状态创建优化布局,例如实现桌面模式。您可以在 MediaPlayerActivity.kt 中查看桌面模式的示例。

  • MediaPlayerActivity.kt
    https://github.com/android/platform-samples/blob/main/samples/user-interface/windowmanager/src/main/java/com/example/platform/ui/windowmanager/MediaPlayerActivity.kt


您还可以访问我们的 Codelab 了解如何使用 Jetpack WindowManager 支持可折叠设备和双屏设备:
https://developer.android.google.cn/codelabs/android-window-manager-dual-screen-foldables



并排显示两个 Activity



除了上述功能您还可以使用最新的稳定版 Jetpack WindowManager API: Activity 嵌入。

  • Activity 嵌入
    https://developer.android.google.cn/reference/kotlin/androidx/window/embedding/package-summary


Android 12L 起,Activity 嵌入允许采用传统多 Activity 架构的开发者通过同一应用,甚至多个应用在大屏设备上并排显示多个 Activity。 

这是以最少的代码更改甚至无需代码更改便可以实现列表详情布局的绝佳方式。

注意: Modern Android Development (MAD) 建议使用基于 Jetpack API (包括 Jetpack Compose) 的单 Activity 架构。如果您的应用使用 Fragment,请参阅 SlidingPaneLayout。Activity 嵌入专为无法轻松更新为 MAD 的多 Activity 旧版应用而设计。


  • SlidingPaneLayout
    https://developer.android.google.cn/jetpack/androidx/releases/slidingpanelayout


这也是该库中最大的变化,目前在 Jetpack WindowManager 1.1 版中,Activity 嵌入 API 非常稳定!

不仅如此,该 API 目前的功能也更加丰富,您可以通过此 API: 
  • 修改分屏行为 (分屏比例、规则、结束行为)

  • 定义占位符
  • 在运行时环境中检查 (并更改) 分屏状态
  • 实现水平分屏
  • 在全窗口中启动模态

如果您想探索 Activity 嵌入,可访问专用 Codelab 了解如何使用 Activity 嵌入构建列表详情布局: 

https://developer.android.google.cn/codelabs/large-screens/activity-embedding


许多应用都已开始在生产环境中使用 Activity 嵌入,例如 WhatsApp: 
还有 eBay!

实现包含多 Activity 的列表详情布局并不是 Activity 嵌入的唯一用例。

自 Android 13 (API 级别 33) 起,应用可以嵌入来自其他应用的 Activity。

跨应用 Activity 嵌入支持多个 Android 应用的 Activity 进行可视化集成处理。系统会在屏幕上并排或上下显示托管应用的 Activity 和其他应用的嵌入 Activity,就像在单一应用 Activity 嵌入中一样。

托管应用会按照实现单一应用 Activity 嵌入的相同方式实现跨应用 Activity 嵌入,但出于安全原因,被嵌入的应用必须同意并选择加入。

您可以在 "Activity 嵌入" 开发者指南中深入了解跨应用嵌入:


  • Activity 嵌入
    https://developer.android.google.cn/guide/topics/large-screens/activity-embedding#cross-application



总结



如果您想优化您的应用在不同设备类型上的用户体验,Jetpack WindowManager 便是您应该学习的最重要的库之一。

WindowManager 还将在每个版本中添加有趣的新功能,敬请关注 1.2 版本中即将推出的功能。

  • 1.2 版本
    https://developer.android.google.cn/jetpack/androidx/releases/window#version_12_2


您可以参阅 Jetpack WindowManager 文档和示例应用,即刻开始使用 WindowManager!欢迎您持续关注 "Android 开发者" 微信公众号,及时了解更多开发技术和产品更新等资讯动态。


  • 文档
    https://developer.android.google.cn/jetpack/androidx/releases/window

  • 示例应用
    https://github.com/android/platform-samples/tree/main/samples/user-interface/windowmanager




推荐阅读

如页面未加载,请刷新重试


 点击屏末 | 阅读原文 | 即刻开始使用 Jetpack WindowManager




继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存