Android 11 :开发者预览版 2
上篇文章 Now in Android #13 中介绍了Android 11 的第一个预览版,现在,第二个预览版已经发布了。该版本主要面对开发者,没有针对一般用户的更新。详细更新信息可以阅读 Android 官方开发者博客上的相关文章:
android-developers.googleblog.com/2020/03/and…
下面介绍几个比较重要的更新。
同步 IME 动画
不知道你有没有吐槽过 Android 的输入法动画,你可以现在打开微信中某个好友的聊天页面,点击输入框弹出软键盘,然后上下滑动聊天记录列表,输入法会迅速消失。这个视觉效果给人一种割裂的感觉,不连贯,就像官方说的没有做到 切换时逐帧精确 。
说起来可能不是那么形象,来一张官方给出的 通过 边衬区动画监听器 实现 IME 同步切换效果(左图) 和 通过WindowInsetsAnimationController 实现应用驱动的 IME 体验(右图) 。
由应用控制 IME 的切换效果可以让 IME 更精准地与应用 UI 同步,比如配合过度滚动 UI 时的动画。
NDK Image Decoder
这是一个 Android 11 新增加的 API,NDK 图片解码,供 native 开发人员使用。
我也没有 Native 开发经验,这里就不多介绍了。感兴趣的可以到 Github 上看看使用示例,地址如下:
Android 11 中的可空性
我们都知道 Kotlin 的类型系统保障了 空安全 ,让我们得以书写更加安全的代码。但是在 SDK 中并不是所有代码都是 Kotlin 写的,那么如何保证 Java 代码的空安全呢?
答案就是 注解。
Kotlin 编译器通过识别 Java 中的 @Nullable
和 @NonNull
注解,来判断对象是否可空,从而在编译期就发现可能存在的空指针错误。当编译器发现空指针,会直接抛出 error 。
另外,Kotlin 编译器还会识别 @RecentlyNullable
和 @RecentlyNonNull
注解,它们的作用和 @Nullable
、@NonNull
是一样的,但是编译器只会发出 warning ,并不会直接抛出错误。
在 Android 11 中,谷歌工程师增加了更多的 @RecentlyNullable
和 @RecentlyNonNull
注解,并将其中的一部分转换成了 @Nullable
和 @NonNull
。这也会是以后 Android 版本升级中的常规工作,来提供更强的空安全能力。
等等,还有更多!
- 针对折叠屏的 铰链角度传感器
- Neural Networks API 的新算子和控制 。我就不解释了,因为我不懂。。来自 Google AI 团队的新发现。
- 添加了两种新的前台服务类型,摄像头 和 麦克风 。如果您的应用要从前台服务访问摄像头或麦克风数据,则需要将对应的 foregroundServiceType 值添加到清单中。
- 应用可以在支持的设备上选择 可变刷新率。
- 模拟器现在支持前后摄像头了。
这是一个完全面向开发者的版本,也是测试你的应用的好时机。谷歌也提供了一个新的设置选项页面,来帮助你测试各种行为变化对你的应用产生的影响。
AndroidX Release
Beta: CameraX
CameraX 离我们越来越近啦。
- 使用 ProcessCameraProvider显式初始化相机
- 通过 最新的 CameraSelector API 选择摄像头
- 通过 CameraInfo 和 CameraControl 更方便的访问相机信息和控制相机。例如缩放,聚焦。
关于 CameraX 的更多文章,如下。
《Android’s CameraX Jetpack Library is now in Beta!》
官网相关介绍:
developer.android.com/jetpack/and…
developer.android.com/training/ca…
Stable
一些库发布了稳定版,都是一些 Bug fix 。
- Fragment 1.2.3
- Paging 2.1.2
- Room 2.2.5
- Webkit 1.2.0,主要更新为支持了暗黑模式。
- WorkManager 2.3.3 和 2.3.4
Alpha
终于对 onActivityResult
下手了。
在最新的 Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 中,通过 ActivityResultRegistry 即可完成 startActivityForResult()/ onActivityResult()
和 requestPermissions() / onRequestPermissionsResult()
的流式处理,而无需在 Activity 和 Fragment 中覆写任何方法。
听起来比较神奇,官网也做了相关介绍。
Getting a Result from an Activity ,文章地址如下:
developer.android.com/training/ba…
这里简单介绍一下使用方法。
val startForResult = prepareCall(StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { val intent = result.intent // Handle the Intent } } override fun onCreate(savedInstanceState: Bundle) { // ... val startButton = findViewById(R.id.start_button) startButton.setOnClickListener { // Use the Kotlin extension in activity-ktx // passing it the Intent you want to start startForResult(Intent(this, ResultProducingActivity::class.java)) } } 复制代码
这是最简单的用法。也可以实现 LifecycleObserver
类,在实现类中处理回调,进一步解耦。
这个特性大概是这一期最吸引我的地方了,后面我会单独写一篇文章来介绍这一特性,这里就不再多说了。
Articles
这一期推荐了不少技术文章,其中一些我已经阅读过了,没读过的我就不过多解释了,感兴趣的可以读读原文。
Themes Overlay
标题: Android Styling: Themes Overlay 地址: medium.com/androiddeve…
这是一个系列的文章,关于 Theme 和 Style ,我还没有阅读。
App Bundle Testing
标题: Developer Tools on Play Store 地址: medium.com/androiddeve…
Apk 很容易交给测试人员测试,那么 App Bundle 如何测试呢?
When, Enums, and R8
Kotlin Vocabulary 系列的最新文章。
标题 :When using enums and R8…地址:medium.com/androiddeve…
当 Enum 和 Switch 或者 When 配合使用时,会导致生成额外的类和数组,而 R8 帮助我们避免了这些不必要的开销。
The Suspend Modifier — Under the Hood
文章地址:
挂起函数与状态机,很值得一读。
Storage in Android 11
文章地址:
大家应该对 分区存储 已经相当了解了。这里介绍了 Android 11 上的一些改进措施。
在 Android 10 上,应用编辑或者删除任何一个媒体文件都需要请求用户确认,现在可以一次请求多个文件了。同时,系统的默认图库应用 (Gallery) 将不再展示这些对话框。
一些开发者试图使用 Storage Access Framework (SAF) 遍历整个文件系统。在 Android 11 中,将不再允许用户授权访问 Downloads 的根目录、每个可用 SD 卡的根目录以及其它应用的目录。应用仍然可以通过 Storage Access Framework API 或者文件选择器来帮助用户从共享存储中选取个别文件。
针对文件管理器类的应用提供了特殊权限 MANAGE_EXTERNAL_STORAGE 。该权限将授权读写所有共享存储内容,这也将同时包含非媒体类型的文件。但是对于其他应用的私有目录,还是无法访问的。
Kotlin Coroutines: Cancellation and Exceptions
这是一个系列的三篇文章,聊了聊协程的取消和异常处理。
Videos
Google 推荐了四个视频。
有关更好的使用无障碍服务。
下面是三个 Kotlin Vocabulary 系列的配套视频。
Kotlin 编译器是如何对协程使用黑魔法的。
www.youtube.com/watch?v=77h…讨论了使用 Kotlin 集合 进行即时计算和使用 序列 进行延迟计算的场景。
对应前面 Article 中介绍过的 R8 优化枚举的文章。
Google Game 峰会
主要涉及游戏开发相关,这里就不做过多介绍了,感兴趣的可以阅读原文。
最后
新一期的 **Now in Android ** 到这里就结束了。
后面我仍会持续跟进 **Now in Android ** 系列,第一时间为大家带来 Android 最新资讯。