原文地址(QQ音乐微信公众号首发): mp.weixin.qq.com/s?__biz=MzI…html
前段时间解决了几个 QQ 音乐多窗口屏幕显示的 bug,虽然这个问题最终不是 Android O 版本的问题,多窗口是 Android 7.1 以后引入的(关于多窗口适配须要注意的地方,能够看看这篇文章:Android Multi-Window详细介绍),可是趁此机会了解一下 Android O 版本的新特性也不错,并且 Google IO 大会刚刚过去,趁这个热度介绍一下。
在大会上介绍到的 Android O 新版本更新和优化主要集中在两个方面:Fluid Experiences 和 Vitals,Fluid Experience 主要包含了四个显著特性:Notification Dots, Picture In Picture, Autofill Framework 和 Smart Text Selection;而 Vitals 主要在电池续航、安全、启动时间以及稳定性这几个方面作优化。java
Android O 版本从新设计了通知,让通知的管理更加方便,首先引入了通知渠道用来让用户统一管理通知,当 targetApi 设置为 O 版本时,必需要实现一个或多个通知渠道,若是设置为 O 版本以前的版本,在 O 版本设备上的行为则和 7.x 版本保持一致。通知渠道提供了一种将应用内的通知变成一个个易于管理组的方法,通知渠道建立并提交到 notification manager 后,便没法经过编程方式修改通知渠道的行为,这些设置以后则由用户掌控。用户如今可使用一致的系统 UI 管理大多数与通知有关的设置。全部发布至同一通知渠道的通知都具备相同的行为。当用户长摁通知或者经过设置去到通知的设置页面的时候,能够看到这些界面:
android
在 Android O 以前,画中画模式已经可用于 Android TV,而 Android O 则让这一个功能能够支持到其余的 Android 设备,当某个 Activity 处于 PIP 模式时,它会回调生命周期的 onPause 方法,因此此时在 PIP 模式下好比视频播放等操做就不可以在 onPause 里面暂停,而应该在 onStop 里面,这一点和多窗口模式同样,来看看它的效果:
git
咱们能够看到在当从 youtube 视频切换出去以后会回到桌面,这时候会有一个视频播放的窗口悬浮在全部的应用之上,这个小窗口在播放视频,而此时点击这个小窗口区域会弹出几个操做按钮,能够选择关闭,或者是从新打开 youtube 视频播放页,并且底部的几个按钮也是能够自定义的,很是方便。
这里须要提到的一点是,升级到 8.0 的系统后不是立马会激活这个功能,激活这个功能可能会有点复杂:github
System UI Tuner
功能,开启的方式是下拉通知栏,长摁右下角的设置按钮,System UI Tuner
已开启;Settings > System > System UI Tuner > Navigation bar
,去到 navigation bar 以后选择 extra left button type
或者 extra right button type
,选择 keycode
,选择完成以后返回到上一个页面填写 right/left keycode
为 171
,表明将当前显示页面变为 PIP 模式窗口(若是不支持页面没有任何反应),而后选择一个 right/left icon
:System UI Tuner
页面,选择 Picture-in-Picture
模式,进去以后将 Minimize 打开便可。android:supportsPictureInPicture
设置为 true,除了上面提到的用户手动将 Activity 变成 PIP 模式,还可使用
Activity.enterPictureInPictureMode(PictureInPictureArgs args)
动态将 Activity 设置为 PIP 模式,
PictureInPictureArgs
这个对象参数是用来指定 Activity 处于 PIP 模式时的行为,此对象还指定了各类属性,例如 Activity 的首选纵横比,同时还可使用
Activity.setPictureInPictureArgs()
更新 Activity 的 PIP 配置设置,若是 Activity 目前处于 PIP 模式,则会更新此设置。
为了帮助开发者更好的与设备 UI 集成,Android O 支持建立自适应图标,系统能够基于设备选择的蒙版将这些图标显示为不一样形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们:
能够经过定义两层图层(前景和背景)来指定桌面图标外观,必须提供没有形状和阴影的 PNG 格式图象做为图层:
在之前的 Android 版本中,图标大小定义为 48 x 48 dp,可是如今必须按照如下的规范定义图层大小:web
Settings > Apps & Notifications > Default apps > Autofill app
,关于如何适配自动填充框架:Autofill Framework:<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/lobster_regular" />
<font
android:fontStyle="italic"
android:fontWeight="400"
android:font="@font/lobster_italic" />
</font-family>复制代码
同时 Android O 和 Android support library 26 提供了一个 API,能够从另外一个应用中获取字体资源,而不是将字体资源打包到 apk 中或者让 apk 去下载,经过 Android support library 26 版本可让这个特性支持到 14 版本或者之上的设备上,具体的 API 能够看看这个:Downloadable Fonts 或者这个 sample android-DownloadableFonts:编程
这个功能在 7.1.1 以后就已经有了,长摁桌面图标就会显示一个 App shortcuts 菜单栏,而后长摁菜单栏上的一项,就能把它拖下来成为单独的一个应用图标,被拖下来的单独的应用图标就是Pinned shortcuts,虽然这个功能在 7.1.1 引入的,可是在 O 版本咱们能够经过提供的 API 按照必定的步骤去使用代码添加:Pinning Shortcuts and Widgets。
适用场景:这个能够将某些应用使用频繁的小功能独立出来,好比 QQ 的最经常使用联系人,音乐的听歌识曲等功能。api
Android O 版本容许设置 TextView 的字体大小根据设置的初始大小自动放大或者缩小,这样就可让字体的显示在不一样的屏幕和不一样的显示内容上达到最优的效果,并且使用 Android support library 26 中的 android.support.v4.widget.TextViewCompat 可让该特性支持到 14 版本,Android O 版本的 TextView 已经能够支持 autosize 了,设置 autosize 特性也很是简单,在 O 版本上,只须要使用 setAutoSizeTextTypeWithDefaults(@AutoSizeTextType int autoSizeTextType)
或者缓存
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoSizeTextType="uniform"
/>复制代码
就能够了,关于使用的细节:Autosizing TextViews。
适用场景:TextView 显示内容较多的时候,若是能够接受的话,适当的减少字体的大小,让显示的字数增长。安全
Android O 版本新增 VolumeShaper 类,用来为应用提供声音的淡入淡出等音效;新增AudioFocusRequest 类用来提供检测音频焦点的新功能;新增了如下的方法 getMetrics 方法用来返回一个包含配置和性能信息的 Bundle 对象:
Android O 容许应用查询和获取设备如何发出声音,应用能够经过 requestAudioFocus()
函数来为设备范围的音频焦点提交一个细粒度的请求,好比传入一个 AudioFocusRequest
对象,设置对应的 type,就能够指定获取焦点的类型,同时能够设置当音频焦点被强占时候应用的行为,轻声继续播放仍是完全暂停。
值得一提的是,在 Android O 上引入了 sony “捐赠”的 LDAC 无线声音加密格式,用来进行高质量音乐的蓝牙通讯,这样就能够经过蓝牙耳机播放真正的无损音乐了:
1. 能够设置 Activity 支持广色域;
2. 能够设置最大的屏幕宽高比;
3. 多屏幕支持,支持设备外接一个显示器;
4. 最新版本 emoji 支持,使用 EmojiCompat
类可让应用在老版本的应用上显示新的 emoji;
5. 支持点击位置的捕捉;
6. 支持设置应用类别,这些类别用于将应用呈现给用户的用途或功能相同的应用归类在一块儿,例如按流量消耗、电池消耗和存储消耗将应用归类。
7. Smart Text Selection,这个功能有人可能在今年老罗的锤子手机发布会上看到过,思想是很相似的,复制一段数字,就会出现直接拨打电话的选项,复制一段地址就会弹出进入地图的选项,地图 APP 能够一下这个地方可否成为一个很方便入口。
这个列举了当前可能会影响应用的几个行为变动。
Android O 在当进程进入已缓存状态时,若是没有活动的组件,系统将解除应用具备的全部唤醒锁(已缓存状态指的是没有前台 Activity 或者正在执行的前台 Service)。同时 Android O 上运行在后台的应用将会有限制的使用后台的 Service,而且应用也不能在 Manifest 中注册一些没必要要的隐式广播用来进行自启等操做:
Android O 包含如下与安全性有关的变动:
Android O 对网络链接和 HTTP(S) 链接行为作出了很多变动,其中包括无正文的 OPTIONS 请求如今有 Content-Length: 0 标头;HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,将 example.com 转化为 example.com/ ;经过 ProxySelector.setDefault() 设置的自定义代理选择器的范围变化;URI 不能包含空白标签;若是以前执行的 connect() 方法失败,send(java.net.DatagramPacket) 方法将会引起 SocketException;在回退到 TCP Echo 协议以前,InetAddress.isReachable() 会尝试执行 ICMP;隧道 HTTP(S) 链接处理进行了一些变动。
变动内容比较繁多:网络链接和 HTTP(S) 链接。
在 Android O 以前,若是应用在运行时请求权限而且被授予该权限,系统会错误地将属于同一权限组而且在清单中注册的其余权限也一块儿授予应用。对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则全部后续对该权限组中权限的请求都将被自动批准。
在针对 Android O 的应用中,若是 Native libraries 包含任何可写且可执行的代码段,则不会再加载 Native libraries,可写和可执行必须是在新版本必须是互斥的,假若某些应用的 Native libraries 包含不正确的加载代码段,则此变动可能会致使这些应用中止工做,官方文档:Writable and Executable Segments。
1. ContentProvider 支持分页,即获取内容的选中区域的子集;
2. ContentProvider 和 ContentResolver 增长 refresh 方法,用来让客户端更容易的知道数据是否是最新;
3. JobScheduler 更新,让应用更容易听从后台执行限制;
4. 集合的处理的变化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引起 NullPointerException;
5. 语言区域和国际化变化;
6. 联系人提供程序使用状况统计方法的变动;
7. 蓝牙 ScanRecord.getBytes() 方法检索的数据长度变动;
8. 输入和导航;
Android O 预览版本提供了几个新的 API 用来管理 WebView:
PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);复制代码
<manifest>
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
...
<application> ... </application>
</manifest>复制代码
Termination Handle API
一块儿搭配使用;
findViewById 函数如今返回的是 <T extends View>,因此之后 findViewById 就不须要强转了。
Android 引入了几个新的 xml 属性:
layout_marginVertical
,同时设置 layout_marginTop
和 layout_marginBottom
属性;layout_marginHorizontal
,同时设置 layout_marginLeft
和 layout_marginRight
属性;paddingVertical
,同时设置 paddingTop
和 paddingBottom
属性;paddingHorizontal
,同时设置 paddingLeft
和 paddingRight
属性;Android O 中,AnimationSet API 如今支持了动画的 seek 和动画倒转播放,seek 操做能够设置 AnimationSet 从指定的点开始播放,倒转播放则将之前须要重复定义两个相反的动画操做简化成只须要定义一个动画便可。
在 Android O 版本以前,应用若是不用 type_toast 显示悬浮窗,通常正常状况下都会使用声明 SYSTEM_ALERT_WINDOW 权限 + 使用 TYPE_SYSTEM_ERROR 的形式来显示悬浮窗,国内的第三方 ROM 也会对此有限制,Android 6.0 版本曾经对悬浮窗有过一次限制,必需要用户手动开启“在其余应用之上显示”的权限才能展现悬浮窗,在 Android O 以后 SYSTEM_ALERT_WINDOW 权限的应用没法再使用如下窗口类型来在其余应用和系统窗口上方显示提醒窗口: