前段时间解决了几个 QQ 音乐多窗口屏幕显示的 bug,虽然这个问题最终不是 Android O 版本的问题,多窗口是 Android 7.1 之后引入的,但是趁此机会了解一下 Android O 版本的新特性也不错。
1.8.2 LDAC 音质增强
值得一提的是,在 Android O 上引入了 sony “捐赠”的 LDAC 无线声音加密格式,用来进行高质量音乐的蓝牙通信,这样就可以通过蓝牙耳机播放真正的无损音乐了:
可以看到使用了 LDAC 无线声音加密协议之后,最高可以达到 990kbps 的传输速率,好消息是不是!但是可惜的是 LDAC 只能在 sony 制造的耳机上使用,比如 £330 MDR-1000X,高呼Sony大法好~~
1.9 其他特性
1.可以设置 Activity 支持广色域;
2.可以设置最大的屏幕宽高比;
3.多屏幕支持,支持设备外接一个显示器;
4.最新版本 emoji 支持,使用 EmojiCompat 类可以让应用在老版本的应用上显示新的 emoji;
5.支持点击位置的捕捉;
6.支持设置应用类别,这些类别用于将应用呈现给用户的用途或功能相同的应用归类在一起,例如按流量消耗、电池消耗和
存储消耗将应用归类。
7.Smart Text Selection,这个功能有人可能在今年老罗的锤子手机发布会上看到过,思想是很类似的,复制一段数字,就会出现直接拨打电话的选项,复制一段地址就会弹出进入地图的选项,地图 APP 可以一下这个地方能否成为一个很方便入口。
2 Android O 版本行为变更
这个列举了当前可能会影响应用的几个行为变更。
2.1 后台执行限制
Android O 在当进程进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁(已缓存状态指的是没有前台 Activity 或者正在执行的前台 Service)。同时 Android O 上运行在后台的应用将会有限制的使用后台的 Service,并且应用也不能在 Manifest 中注册一些不必要的隐式广播用来进行自启等操作:
- 应用无法使用其清单注册大部分隐式广播(即并非专门针对此应用的广播,比如 ACTION_PACKAGE_REPLACED(https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED) 针对所有应用是一个隐式广播,而ACTION_MY_PACKAGE_REPLACED(https://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED)只针对本应用就不是一个隐式广播)。
上面的限制针对 targetApi 为 O 和之上的应用生效,但是用户可以在设置页面设置让这个限制对所有 targetApi 的应用生效。
处于前台时,应用可以自由创建和运行前台服务与后台服务。 进入后台时,在某些情况下,在一个持续数分钟的时间窗内,应用仍可以创建和使用服务,这些情况包括:
- 正在从通知处理 PendingIntent 消息;
但是在该时间窗结束后,应用将被视为处于空闲状态, 此时系统将停止应用的后台服务,就像应用已经调用服务的 Service.stopSelf() 方法一样。
官方建议多使用 JobScheduler 来处理后台任务,详细的适配指南:后台执行限制(https://developer.android.com/preview/features/background.html)。
2.2 安全性
Android O 包含以下与安全性有关的变更:
- 应用的 WebView 对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性;
- 在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection 不再尝试回退到之前的 TLS 协议版本并重试的权宜方法;
- Android O 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。
2.3 网络连接和 HTTP(S) 连接
Android O 对网络连接和 HTTP(S) 连接行为做出了不少变更,其中包括无正文的 OPTIONS 请求现在有 Content-Length: 0 标头;HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,将 http://example.com 转化为 http://example.com/ ;通过 ProxySelector.setDefault() 设置的自定义代理选择器的范围变化;URI 不能包含空白标签;如果之前执行的 connect() 方法失败,send(java.net.DatagramPacket) 方法将会引发 SocketException;在回退到 TCP Echo 协议之前,InetAddress.isReachable() 会尝试执行 ICMP;隧道 HTTP(S) 连接处理进行了一些变更。
变更内容比较繁多:网络连接和 HTTP(S) 连接(https://developer.android.com/preview/behavior-changes.html#networking-all)。
2.4 权限
在 Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
2.5 媒体变更
- 使用 AudioTrack 时,如果应用请求了足够大的音频缓冲区,则框架将尝试使用深度缓冲区输出(如果可用);
- 音频流类型应仅用于音量控制;所有其他流类型的使用(例如 AudioTrack 构造函数)仍有效,但系统会将其作为错误记录下来;
- 所有与音频相关的 API 均使用 AudioAttributes 来描述音频播放用例;
- 框架会执行音频闪避,进行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 时,应用不会失去焦点。新的 API 适用于需要暂停而不是闪避的应用。不过,Android O 中未提供此行为。
2.6 Native libraries
在针对 Android O 的应用中,如果 Native libraries 包含任何可写且可执行的代码段,则不会再加载 Native libraries,可写和可执行必须是在新版本必须是互斥的,倘若某些应用的 Native libraries 包含不正确的加载代码段,则此变更可能会导致这些应用停止工作,官方文档:Writable and Executable Segments(https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#Writable-and-Executable-Segments-Enforced-for-API-level-26)。
2.7 其他
1.ContentProvider 支持分页,即获取内容的选中区域的子集
2.ContentProvider 和 ContentResolver 增加 refresh 方法,用来让客户端更容易的知道数据是不是最新;
3.JobScheduler 更新,让应用更容易遵从后台执行限制;
4.集合的处理的变化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;
5.语言区域和国际化变化(https://developer.android.com/preview/behavior-changes.html#lai);
6.联系人提供程序使用情况统计方法的变更(https://developer.android.com/preview/behavior-changes.html#cpu);
7.蓝牙 ScanRecord.getBytes() 方法检索的数据长度变更(https://developer.android.com/preview/behavior-changes.html#bt);
8.输入和导航(https://developer.android.com/preview/behavior-changes.html#ian);
3 Android O 版本 API 变更
3.1 WebView 新 API
Android O 预览版本提供了几个新的 API 用来管理 WebView:
- 第一个是提供获取 WebView 版本信息的 API:
- 可以再 Manifest 中配置 enable,然后在 WebView 打开未知不安全 url 的时候提示用户:
- WebView 绘制进程被杀或者 Crash 的回调;
- 用来设置 WebView 绘制进程的优先级别,为了提供应用的稳定性,一般情况下应用不需要去修改绘制进程优先级,如果需要使用请和
3.2 findViewById
findViewById 函数现在返回的是 <T extends View>,所以以后 findViewById 就不需要强转了。
3.3 统一的 margins 和 padding
Android 引入了几个新的 xml 属性:
- layout_marginVertical,同时设置 layout_marginTop 和 layout_marginTop 属性;
- layout_marginHorizontal,同时设置 layout_marginLeft 和 layout_marginRight属性;
- paddingVertical,同时设置 paddingTop 和 paddingBottom属性;
- paddingHorizontal,同时设置 paddingLeft 和 paddingRight属性;
3.4 AnimationSet
Android O 中,AnimationSet API 现在支持了动画的 seek 和动画倒转播放,seek 操作可以设置 AnimationSet 从指定的点开始播放,倒转播放则将以前需要重复定义两个相反的动画操作简化成只需要定义一个动画即可。
3.5 提醒窗口
在 Android O 版本之前,应用如果不用 type_toast 显示悬浮窗,一般正常情况下都会使用声明 SYSTEM_ALERT_WINDOW 权限 + 使用 TYPE_SYSTEM_ERROR 的形式来显示悬浮窗,国内的第三方 ROM 也会对此有限制,Android 6.0 版本曾经对悬浮窗有过一次限制,必须要用户手动开启“在其他应用之上显示”的权限才能展示悬浮窗,在 Android O 之后 SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口:
相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型,在使用 TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,也增加了一下限制:
- 应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面;
- 系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果;
- 通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。