回顾 | Jetpack WindowManager 更新
Android 11 加入的新 API
https://developer.android.google.cn/reference/kotlin/android/view/WindowMetrics
新建一个 WindowManager
val windowManager = WindowManager(context: Context)
@Deprecated
val windowManager = WindowManager(context: Context, windowBackend: WindowBackend?)
原有的构造函数
https://developer.android.google.cn/reference/androidx/window/WindowManager#WindowManager(android.content.Context,%20androidx.window.WindowBackend)样例工程
https://github.com/android/user-interface-samples/tree/main/WindowManager
添加 DisplayFeature 弃用 DeviceState
另一个重大变化是弃用了 DeviceState 类,同时也弃用了使用它通知您应用的回调。之所以这样做,是因为我们希望提供更加通用的 API,这些通用的 API 允许系统向您的应用返回所有可用的 DisplayFeature 实例,而不是定义全局的设备状态。我们在 alpha06 的版本中已经将 DeviceState 从公共 API 中移除,请改用 FoldingFeature。
alpha02 版本引入了带有更新了回调协议的新 DisplayFeature 类,以在 DisplayFeature 更改时通知您的应用。您可以注册、反注册回调来使用这些方法:
registerLayoutChangeCallback(@NonNull Executor executor, @NonNull Consumer<WindowLayoutInfo> callback)
unregisterLayoutChangeCallback(@NonNull Consumer<WindowLayoutInfo> callback)
WindowLayoutInfo 包含了位于 window 内的 DisplayFeature 实例列表。
DisplayFeature
https://developer.android.google.cn/reference/androidx/window/DisplayFeature
FoldingFeature 类实现了 DisplayFeature 接口,其中包含了有关下列类型功能的信息:
TYPE_FOLD(折叠类型)
TYPE_HINGE(铰链类型)
设备可能的折叠状态如下:
需要注意的是这里没有与 DeviceState 中 POSTURE_UNKNOWN 和 POSTURE_CLOSED 姿态对应的状态。
要获取最新的状态信息,您可以使用已注册回调返回的 FoldingFeature 信息:
class LayoutStateChangeCallback : Consumer<WindowLayoutInfo> {
override fun accept(newLayoutInfo: WindowLayoutInfo) {
// 检查 newLayoutInfo. getDisplayFeatures() 的返回值,
// 看它是否为 FoldingFeature 实例,并获取其中的信息。
}
}
Jetpack WindowManager 示例
https://github.com/android/user-interface-samples/tree/main/WindowManager
更好的回调注册
R8 规则
我们在库中添加了 R8 的 "keep" 规则,以保留那些因为内部模块的组织架构而可能被删除的方法或类。这些规则会自动合并到应用最终的 R8 规则中,这样可以防止应用出现如 alpha01 版本上的崩溃。
WindowMetrics
由于历史的命名习惯和各种可能的 Window Manager 状态,在 Android 上获取当前 window 的尺寸信息比较困难。Android 11 中一些被废弃的方法 (例如 Display#getSize 和 Display#getMetrics) 和在 window 尺寸新的 API 的使用,都凸显了可折叠设备从全屏到多窗口和自适应窗口这一上升的趋势。为了简化这一过渡过程,我们在 Android 11 中增加了 WindowMetrics API。
WindowMetrics API
https://developer.android.google.cn/reference/android/view/WindowMetrics
API 返回的结果不包括系统 inset 信息,比如状态栏或导航栏,这是由于目前支持的所有 Android 版本中,在第一次布局完成之前,这些值对应的区域都不可用。关于使用 ViewCompat 去获取系统可用 inset 信息,Chris Banes 的文章 - 处理视觉冲突|手势导航 (二) 是非常好的资源。API 返回的边界信息也不会对布局填充时可能发生变化的布局参数作出响应。
ViewCompat
https://developer.android.google.cn/reference/androidx/core/view/ViewCompat
val windowManager = WindowManager(context: Context)
WindowMetrics API
https://developer.android.google.cn/reference/kotlin/androidx/window/WindowMetrics
windowManager.currentWindowMetrics
windowManager.maximumWindowMetrics
联系我们
我们非常希望得到您对这些 API 的反馈,尤其是您认为缺少的那些,或者可让您开发变得更轻松的那些反馈。有一些使用场景我们可能没有考虑到,所以希望您在 public tracker 上向我们提交 bug 或功能需求。
public tracker
https://issuetracker.google.com/issues/new?component=840395&template=1412556
推荐阅读