5 月 20 号参加了 Android Q Labs, 因此本篇说一说会议的部分内容以及自己的一些想法.
会议主要是加深开发者对 Android Q 的了解, 从而帮助开发者做好 Android Q 的兼容工作.
因此本篇我会选择性说明一些在 Android Q 上你需要兼容的一些事情.
1. 后台 Activity 启动限制
首先我们说说为什么要限制后台 Activity 的启动.
Android Q 之前的情况如下:
考虑下面的几个场景:
我在开车过程中使用导航地图进行导航
我在使用拍照功能拍摄一个关键场景的视频
我在玩游戏, 比如王者荣耀, 正准备团战拿五杀的时刻
......
假设在上面的几个场景中, 突然后台 Activity 弹出一个框, 可能是广告框, 也可能是抢占我界面的其他界面.
这个时候我觉得内心是奔溃的, 而且用户体验超级不好.
基于此, Android Q 里面引入了对后台 Activity 启动的限制.
注意关键的一个点是这个变化对所有在 Android Q 上运行的应用都会有影响. 无论你的 targetSDK 版本.
所以如果你的 App 存在这种场景的情况下, 你就需要做一下额外处理了.
基本的处理方式是通过 Notification 弹一个通知, 如果用户想点再点击进入你的 Activity.
那么现在有哪些 App 会用到这种呢? 举一个大家熟悉的.
这边测试了一下, 微信语音通话是会直接从后台启动全屏覆盖的, 所以可能微信需要针对这个行为变更做处理.
2. 存储的变化
先看下 Q 之前的情况:
Q 的变化分两部分来说明吧.
一部分是 MediaStore 的处理, 另一部分是分区存储的处理.
先说说 MediaStore, 什么是 MediaStore 呢?
对于 MediaStore,Q 的处理如下:
可以看到对于 MediaStore, 可以直接写, 读的话仅仅限于自己写进去的文件. 如果要查看其它应用提供的内容, 需要获取读权限.
另外你会发现 MediaStore 上面只有媒体相关的, 如果文件是非媒体类型呢? 所以 Q 新增 MediaStore.Downloads, 如下:
总结起来如下:
权限的变更: 在没卸载的情况下, 自己 App 写或者读 MediaStore 媒体文件不需要权限. 读其他的需要权限. 卸载后读自己之前写入的也需要权限.
另外还有一个就是图片有一个位置信息, 这个对用户来说也是隐私, 因此需要做额外处理.
说完了 MediaStore, 接下来说说分区存储.
总结起来就是分区存储模式下, 不能够再直接访问 /sdcard 下的文件, 而要通过 MediaStore 或者 SAF. 当然自己 packagename 命名的目录下面还是可以访问的.
另外目前可以通过在清单文件设置是否启用. 可以设置 targetSDK 为 Q 的应用不启用, 也可以设置 targetSDK 低于 Q 的启用. 通过代码可以确认是否处于分区存储模式下.
推荐尽快完成适配, 因为目前是为了给开发者更多时间适应这个变化, 等到下一个版本 Android R 的时候会强制执行分区存储模式, 到时候清单文件的设置也是没用的. 因此强烈建议将这个工作排上兼容行程. 当然在 Q 的兼容上可以根据自身业务进度进行设置, 假设时间不够, 可以暂时不启用, 但是后续需要排期处理.
3. 位置权限
我们看看 Android P 申请位置权限的对话框:
可以看到只有允许和拒绝两个选项.
现在看看 Android Q 的:
会发现多了一些选项, 其中有一个仅在使用该应用时允许.
在 Android P 的时候, 清单文件只需要申请一个权限:
而在 Q 上面, 有两个, 其中一个有 background 的.
之所以有两个, 就是希望尽量少的获取权限, 除非是你的 App 真的有这个需求. 在申请的时候也建议增量申请, 什么意思呢?
首先第一步先获取位置权限:
在用户允许的情况下, 如果 App 需要, 再进行增量权限请求:
推荐的位置权限最佳实践如下:
4. 深色主题
Q 支持深色主题, 兼容有两种方式.
一种就是简单粗暴, 适合时间少的.
一种就是推荐的, 适合有足够时间的.
简单的方式如果是全局设置, 只需要设置主题即可:
如果你需要对单个 View 做设置, 也是可以的:
推荐的方式是使用 DayNight.
不过我在测试区启动深色主题时发现有点卡, 估计后面系统还需要优化.
5. BubbleView 和指纹识别
BubbleView 其实就是悬浮窗. 指纹识别也是 Android Q 引入的一个官方方式.
这个不需要做兼容, 算是新功能, 这里不赘述.
6. Kotlin vs Flutter
其实在代码演示的时候, 我注意到 PPT 上面的代码基本都是 Kotlin.
包括之前的 Kotlin-first 以及这次 Q & A 环节也有小伙伴提问到底 Google 主推 Kotlin 还是 Flutter.
我这边说下我的看法吧.
我觉得 Kotlin 和 Flutter 不冲突.
首先第一个 Kotlin 是一门语言, 而 Flutter 是一个跨平台方案.
如果你的 App 有跨平台的需求, 或者有很多页面需要开发, 人手不足, 功能迭代比较频繁, 那么你可以了解或者尝试使用 Flutter 来开发界面. 一套代码, 两端运行. 尤其 Flutter 1.5 布局很广, 涵盖了移动端, web, 桌面端和嵌入式.
对于 Android 开发者, 可以看我的 Flutter 即学即用系列博客快速入门.
说完了 Flutter, 说下 Kotlin 吧.
Kotlin 是一门语言, 语言是干嘛的? 是实现我们业务的工具.
假设现在 Java 和 Kotlin 都可以实现我们的业务功能, 并且官方都支持这两种语言, 你有必要花很多时间去单独学习 Kotlin 吗? 我觉得没太大必要.
所以我觉得对待 Kotlin 你可以了解一下, 能够看懂 Kotlin 代码, 会写简单的 Demo, 我觉得就够了.
当然如果你时间足够, 想多学一门语言, 完全没问题.
以上是参加这次会议的一些简单总结和看法, 更多内容通过下面的全程录像了解.
来源: https://www.cnblogs.com/nesger/p/10928900.html