Android Q 兼容那些事
文章微信公众号「androidtraveler」首发
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,我觉得就够了。
当然如果你时间足够,想多学一门语言,完全没问题。
以上是参加这次会议的一些简单总结和看法,更多内容通过下面的全程录像了解。
本次 android q labs 全程录像可以通过链接观看:android q labs