美文网首页安卓开发Android知识Android开发
Android O新特性和行为变更总结

Android O新特性和行为变更总结

作者: Shawn_Dut | 来源:发表于2017-07-07 19:37 被阅读474次

原文地址(QQ音乐微信公众号首发): https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651232573&idx=1&sn=56963d1ecb1eeea2c82ec88d9667c0b0&chksm=f1d9e45ec6ae6d480b1b8ab73b

1. Android O 新特性

前段时间解决了几个 QQ 音乐多窗口屏幕显示的 bug,虽然这个问题最终不是 Android O 版本的问题,多窗口是 Android 7.1 之后引入的(关于多窗口适配需要注意的地方,可以看看这篇文章:Android Multi-Window详细介绍),但是趁此机会了解一下 Android O 版本的新特性也不错,而且 Google IO 大会刚刚过去,趁这个热度介绍一下。
  在大会上介绍到的 Android O 新版本更新和优化主要集中在两个方面:Fluid ExperiencesVitalsFluid Experience 主要包含了四个显著特性:Notification Dots, Picture In Picture, Autofill Framework 和 Smart Text Selection;Vitals 主要在电池续航、安全、启动时间以及稳定性这几个方面做优化。

1.1 通知变更

Android O 版本重新设计了通知,让通知的管理更加方便,首先引入了通知渠道用来让用户统一管理通知,当 targetApi 设置为 O 版本时,必须要实现一个或多个通知渠道,如果设置为 O 版本之前的版本,在 O 版本设备上的行为则和 7.x 版本保持一致。通知渠道提供了一种将应用内的通知变成一个个易于管理组的方法,通知渠道创建并提交到 notification manager 后,便无法通过编程方式修改通知渠道的行为,这些设置之后则由用户掌控。用户现在可以使用一致的系统 UI 管理大多数与通知有关的设置。所有发布至同一通知渠道的通知都具有相同的行为。当用户长摁通知或者通过设置去到通知的设置页面的时候,可以看到这些界面:


通过这个设置页面可以看到,用户可以将应用所有的通知渠道关闭,或者关闭某一个单独的通知渠道,每一个通知渠道也有相应的行为,用户可以去自行修改,比如修改通知渠道的优先级,如果支持的话,用户还可以去声明通知是否同时显示为应用的角标。Android O 还引入了通知角标,当一个应用的通知没有 dismiss 的时候,会在应用的图标上面显示一个角标,长摁这个应用的图标,也会显示通知的详情信息:

  O 版本弃用了对单个通知设置优先级的功能,现在是对通知渠道设置优先级,该通知渠道的所有通知都适用于该优先级,优先级从 IMPORTANCE_NONE(0)IMPORTANCE_HIGH(4),对用户的提醒等级从小到大。关于创建通知渠道组,向渠道组发送通知或者修改通知渠道组设置的代码可以查看 Google 文档:通知渠道
  同时还引入了一个通知睡眠的功能,用户可以休眠一个通知,让它在指定的时候再出现,被休眠的时候仍然可以修改这个通知的设置,但是不会让这个通知立马出现。另外还可以设置一个通知的超时时间,用来让某个通知在一段时间之后被自动 cancel。其他的比如可以获取通知的清除方式,修改通知的背景颜色,修改通知的样式可以看官方文档:Android O-通知
  使用场景:针对应用的不同优先级别的通知设置不同的通知渠道,强提醒可以发出声音加震动,弱提醒可能仅仅只需要呼吸灯和角标这样等,这样可以最大程度减少对用户的干扰。

1.2 画中画模式

在 Android O 之前,画中画模式已经可用于 Android TV,而 Android O 则让这一个功能可以支持到其他的 Android 设备,当某个 Activity 处于 PIP 模式时,它会回调生命周期的 onPause 方法,所以此时在 PIP 模式下比如视频播放等操作就不能够在 onPause 里面暂停,而应该在 onStop 里面,这一点和多窗口模式一样,来看看它的效果:


我们可以看到在当从 youtube 视频切换出去之后会回到桌面,这时候会有一个视频播放的窗口悬浮在所有的应用之上,这个小窗口在播放视频,而此时点击这个小窗口区域会弹出几个操作按钮,可以选择关闭,或者是重新打开 youtube 视频播放页,而且底部的几个按钮也是可以自定义的,非常方便。
  这里需要提到的一点是,升级到 8.0 的系统后不是立马会激活这个功能,激活这个功能可能会有点复杂:<ul><li>第一步开启 System UI Tuner 功能,开启的方式是下拉通知栏,长摁右下角的设置按钮,


直到系统提示 System UI Tuner 已开启;</li><li>第二步去设置页面 Settings > System > System UI Tuner > Navigation bar,去到 navigation bar 之后选择 extra left button type 或者 extra right button type,选择 keycode,选择完成之后返回到上一个页面填写 right/left keycode171,代表将当前显示页面变为 PIP 模式窗口(如果不支持页面没有任何反应),然后选择一个 right/left icon

之后就会在导航栏上出现一个新增的按钮,这个按钮就是用来将页面进入 PIP 模式;
</li><li>第三步再返回上一个System UI Tuner页面,选择 Picture-in-Picture 模式,进去之后将 Minimize 打开即可。</li></ul>
完成上面的操作之后,进入支持 PIP 模式的页面,比如 youtube 的视频播放页面,点击导航栏新增的那个按钮,页面就会缩小到一个小窗口播放,如上面的实例图片所示。
  要指定 Activity 可以使用 PIP 模式,需要在 Manifest文件中将 android:supportsPictureInPicture 设置为 true,除了上面提到的用户手动将 Activity 变成 PIP 模式,还可以使用 Activity.enterPictureInPictureMode(PictureInPictureArgs args) 动态将 Activity 设置为 PIP 模式, PictureInPictureArgs 这个对象参数是用来指定 Activity 处于 PIP 模式时的行为,此对象还指定了各种属性,例如 Activity 的首选纵横比,同时还可以使用 Activity.setPictureInPictureArgs() 更新 Activity 的 PIP 配置设置,如果 Activity 目前处于 PIP 模式,则会更新此设置。
  使用场景:这个功能就很贴心了,比起以前的 Multi-window,这个更强调两个应用的主次之分,比较适合的场景可能有视频播放页面的最小化,地图应用的最小化等等。针对 QQ 音乐来说可以使用在直播页面,MV 播放页面等等。

1.3 自适应图标

为了帮助开发者更好的与设备 UI 集成,Android O 支持创建自适应图标,系统可以基于设备选择的蒙版将这些图标显示为不同形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们:



  这个场景可以参考 Chrome 的记住账号和密码功能,例如现在的 QQ 登录其实是已经做了一个类似的 Auto-Fill 功能,比较适合用在账号密码等场景上。

1.5 xml 字体和可下载字体

Android O 推出了 xml 字体,可以在资源文件中建立 font 字体资源文件夹,放入相应的字体 ttf 文件,然后建立自己的字体 xml 文件,在 R 文件中编译,最终作为一种资源供 TextView 等使用,



可以看到使用了 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 中注册一些不必要的隐式广播用来进行自启等操作:<ul><li>在后台运行的应用对后台服务的访问受到限制;</li><li>应用无法使用其清单注册大部分隐式广播(即并非专门针对此应用的广播,比如 ACTION_PACKAGE_REPLACED 针对所有应用是一个隐式广播,而ACTION_MY_PACKAGE_REPLACED只针对本应用就不是一个隐式广播)。</li></ul>上面的限制针对 targetApi 为 O 和之上的应用生效,但是用户可以在设置页面设置让这个限制对所有 targetApi 的应用生效。
  处于前台时,应用可以自由创建和运行前台服务与后台服务。 进入后台时,在某些情况下,在一个持续数分钟的时间窗内,应用仍可以创建和使用服务,这些情况包括:<ul><li>正在处理高优先级别的 FCM 消息;</li><li>正在接收例如 SMS/MMS 的消息广播;</li><li>正在从通知处理 PendingIntent 消息;</li></ul>但是在该时间窗结束后,应用将被视为处于空闲状态, 此时系统将停止应用的后台服务,就像应用已经调用服务的 Service.stopSelf() 方法一样。
    官方建议多使用 JobScheduler 来处理后台任务,详细的适配指南:后台执行限制

2.2 安全性

Android O 包含以下与安全性有关的变更:<ul><li>不再支持 SSLv3;</li><li>应用的 WebView 对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性;</li><li>在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection 不再尝试回退到之前的 TLS 协议版本并重试的权宜方法;</li><li>Android O 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。</li></ul>

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) 连接

2.4 权限

在 Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android O 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

2.5 媒体变更

<ul><li>使用 AudioTrack 时,如果应用请求了足够大的音频缓冲区,则框架将尝试使用深度缓冲区输出(如果可用);</li><li>音频流类型应仅用于音量控制;所有其他流类型的使用(例如 AudioTrack 构造函数)仍有效,但系统会将其作为错误记录下来;</li><li>当用户打电话时,活动的媒体流将在通话期间静音;</li><li>所有与音频相关的 API 均使用 AudioAttributes 来描述音频播放用例;</li><li>框架会执行音频闪避,进行 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 时,应用不会失去焦点。新的 API 适用于需要暂停而不是闪避的应用。不过,Android O 中未提供此行为。</li></ul>

2.6 Native libraries

在针对 Android O 的应用中,如果 Native libraries 包含任何可写且可执行的代码段,则不会再加载 Native libraries,可写和可执行必须是在新版本必须是互斥的,倘若某些应用的 Native libraries 包含不正确的加载代码段,则此变更可能会导致这些应用停止工作,官方文档:Writable and Executable Segments

2.7 其他

1. ContentProvider 支持分页,即获取内容的选中区域的子集;
  2. ContentProvider 和 ContentResolver 增加 refresh 方法,用来让客户端更容易的知道数据是不是最新;
  3. JobScheduler 更新,让应用更容易遵从后台执行限制;
  4. 集合的处理的变化,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;
  5. 语言区域和国际化变化
  6. 联系人提供程序使用情况统计方法的变更
  7. 蓝牙 ScanRecord.getBytes() 方法检索的数据长度变更
  8. 输入和导航

3 Android O 版本 API 变更

3.1 WebView 新 API

Android O 预览版本提供了几个新的 API 用来管理 WebView:<ul><li>Version API</li>第一个是提供获取 WebView 版本信息的 API:

PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);

<li>Google Safe Browsing API</li>可以再 Manifest 中配置 enable,然后在 WebView 打开未知不安全 url 的时候提示用户:

<manifest>
    <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
               android:value="true" />
    ...
    <application> ... </application>
</manifest>

<li>Termination Handle API</li>WebView 绘制进程被杀或者 Crash 的回调;
<li>Renderer Importance API</li>用来设置 WebView 绘制进程的优先级别,为了提供应用的稳定性,一般情况下应用不需要去修改绘制进程优先级,如果需要使用请和 Termination Handle API 一起搭配使用;</ul>

3.2 findViewById

findViewById 函数现在返回的是 <T extends View>,所以以后 findViewById 就不需要强转了。

3.3 统一的 margins 和 padding

Android 引入了几个新的 xml 属性:
<ul><li>layout_marginVertical,同时设置 layout_marginToplayout_marginTop 属性;</li><li>layout_marginHorizontal,同时设置 layout_marginLeftlayout_marginRight属性;</li><li>paddingVertical,同时设置 paddingToppaddingBottom属性;</li><li>paddingHorizontal,同时设置 paddingLeftpaddingRight属性;</li></ul>

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 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口:<ul><li>TYPE_PHONE</li><li>TYPE_PRIORITY_PHONE</li><li>TYPE_SYSTEM_ALERT</li><li>TYPE_SYSTEM_OVERLAY</li><li>TYPE_SYSTEM_ERROR</li></ul>
相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型,在使用 TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,也增加了一下限制:<ul><li>应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面;</li><li>系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果;</li><li>通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。</li></ul>

相关文章

网友评论

    本文标题: Android O新特性和行为变更总结

    本文链接:https://www.haomeiwen.com/subject/hzhizttx.html