官网 [Android Q预览](https://developer.android.com/about/versions/10)
项目中的 `targetSdkVersion` 改为 `29(10.0)` 。
[Android Q版本应用兼容性适配指导](https://blog.csdn.net/irizhao/article/details/94121551) 这篇文章进行了全面的讲述。
下面我只从中记录一下一般项目中会遇见的场景。
## 分区存储
在 `Scoped Storage` 新特性中,外部存储空间被分为两部分:
- 公共目录:`Downloads`、`Documents`、`Pictures` 、`DCIM`、`Movies`、`Music`、`Ringtones`等
- 公共目录下的文件在APP卸载后,不会删除。
- APP可以通过SAF(System Access Framework)、MediaStore接口访问其中的文件。
- App-specific目录
- APP卸载后,数据会清除。
- APP的私密目录,APP访问自己的App-specific目录时无需任何权限。
在`Android Q`上,`targetSDK`大于或等于`29`的`APP`默认被赋予`Filtered View`,反之则默认被赋予`Legacy View`。`APP`可以在`AndroidManifest.xml`中设置新属性`requestLegacyExternalStorage`来修改外部存储空间视图模式,`true`为`Legacy View`,`false`为`Filtered View`。可以使用`Environment.isExternalStorageLegacy()`这个`API`来检查`APP`的运行模式。APP开启`Filtered View`后,`Scoped Storage`新特性对APP生效。
`Android Q`除了划分外部存储和定义`Filtered View`,还在查询、读写文件的一些细节上做了改进或限制,例如图片文件中的地理位置信息将不再默认提供、查询`MediaProvider`获得的`DATA`字段不再可靠、新增了文件的`Pending`状态等等。
小米AndroidQ适配:https://dev.mi.com/console/doc/detail?pId=1697
华为AndroidQ适配:https://developer.huawei.com/consumer/cn/devservice/doc/50127
OPPO AndroidQ适配:https://open.oppomobile.com/wiki/doc#id=10432
VIVO AndroidQ适配:https://vcl.vivo.com.cn/#/home/index
## 禁止应用读取设备标识符信息
1. `TargetSdkVersion<Q`并且没有申请`READ_PHONE_STATE`权限,或者`TargetSdkVersion>=Q`,获取`device id`会抛异常`SecurityException`;
2. `TargetSdkVersion<Q`并且申请了`READ_PHONE_STATE`,通过`getDeviceId`接口读取的值为`Null`;
3. 无法获取到`device id`,会对应用依赖`device id`的功能产生影响。
## 禁止后台应用启动Activity
安卓`Q`版本限制了应用后台启动`Activity`,该变更的目的是最大限度减少后台应用弹界面对用户的打扰,在`Android Q`上运行的应用只有在满足以下一个或多个条件时才能启动`Activity`
1. 应用处于前台;
2. 桌面`widget`点击启动`Activity`;
3. 由桌面点击启动应用;
4. 由`Recent`点击启动应用;
5. 前台应用启动后台应用;
6. 临时白名单机制,不拦截通过通知拉起的应用。
1. 应用通过通知,在pendingintent中启动activity;
2. 应用通过通知,在pendingintent中发送广播,接收广播后启动activity,加入临时白名单不拦截。
3. 应用通过通知,在pendingintent中启动service,在service中启动activity,加入临时白名单不拦截。
## 后台应用地理位置权限
`Android Q`针对位置信息新增了`ACCESS\_BACKGROUND\_LOCATION`权限,以管控应用是否可以在后台访问位置信息。原有的`ACCESS\_COARSE\_LOCATION`和`ACCESS\_FINE\_LOCATION`权限用于管控应用在前台是否可以获取位置信息。
## 支持so问价的64位架构
## 非SDK接口管控
`Google`认为非公开接口可能在不同版本之间进行变动从而导致应用兼容性问题,因此从`Android P`开始强制约定三方应用只能使用`Android SDK`公开的类和接口;对于非公开的`API,Google`按照不同名单类型进行不同程度的限制使用。
## WIFI相关接口变更
`Android Q`为了更好的保护用户的隐私,让用户知晓应用对`Wi-Fi`配置的改动,其限制了应用对`WifiManager`重要接口的调用,三方应用将无法正常使用这些接口。此外,针对`Wi-Fi Direct`相关的广播以及接口也做了调整。
- 写在前面的话
- Java
- 基础
- Double的比较
- 小数怎么用二进制表示
- 多线程
- 并发和并行
- 线程池
- 线程池背景
- 线程池构造
- 任务阻塞队列
- Flutter
- 基础知识
- Dart基础
- Android
- 项目架构
- View
- 非UI线程更新View
- AlarmManager
- 对比postDelaryed和Timer
- Bitmap
- 加载100M的图片却不撑爆内存
- Bitmap压缩
- Bitmap局部解码
- 计算图片的内存占用
- Android动画
- Android动画类型
- Android动画原理
- 属性动画
- 帧动画
- 补间动画
- 使用动画的注意事项
- Android新特性
- 权限组
- Android23(Marshmallow)-6.0
- Android24(Nougat)-7.0
- Android26(Oreo)-8.0
- Android28(Pie)-9.0
- Android29(Q)-10.0
- AndroidX迁移
- Kotlin
- 关键字
- Kotlin操作符
- CoroutineScope
- Flow
- CoroutineException