Android7.0写给开发者的一封信(官网同步翻译)
版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com
先说明这个标题和内容的关系,主要是Android7.0对于开发者的说明的文章,利用Google翻译,加上一点自己的理解,第一次做这种羞羞的事,做的不好地方大家将就着看看,不喜欢的请轻喷。
Android N(Nougat牛轧糖)在2016年8月22如期发布,在它正式发布前就向SDK推送了Deveoper Preview
,Android N的很多新特性也被广大的开发者朋友挖掘出来了,那么官网上也有几篇关于Android N的变化的文章,下面就和大家一起来学习一下Android N的一些先关知识。
。如果你自认为你的英语还可以,推荐你阅读官网的文章:
- Android N for Developers:Android N为开发者介绍新功能。
如果想了解更多关于Android7.0的知识,可以阅读Android 7.0行为变化(官网同步翻译)。
Android N为开发者介绍新功能
Android N目前任然是开发状态,但现在Android N Developer Preview
已经可以进行试用了。以下部分重点介绍面向开发者的一些新功能。
请务必查阅行为变更(第二章节)以了解平台行为变更可能影响到你的App的地方,看看开发者指南,了解有关关键功能的更多信息,并下载Sample参考后获取新API的详细信息。
多窗口支持
在 Android N 中,Google为该平台引入了一个新的而且非常需要的多任务处理功能 —— 多窗口支持。
现在,用户可以一次在屏幕上打开两个应用。
- 在运行Android N的手机和平板电脑上,用户可以并排运行两个应用,或者处于分屏模式时一个应用位于另一个应用之上。用户可以通过手指拖动两个应用之间的分隔线来调整应用的边框大小。
- 在Android TV设备上,应用可以将自身置于画中画模式,从而让它们可以在用户浏览或与其他应用交互时继续显示内容。
多窗口支持为我们提供了新的吸引用户的方式,特别是在平板电脑和其他更大屏幕的设备上。 你甚至可以在应用中启用拖放,从而使用户可以方便地将内容拖放到你的应用或从你的APP中拖出内容 —— 这个操作是一个增强用户体验的好方法。
在你的应用中添加多窗口支持并配置多窗口显示的处理方式也不难。比如,你可以指定你的Activity允许缩放的最小尺寸,从而防止用户用手指拖动调整APP边框时将Activity调整的过于小。当然,你也可以禁用APP的多窗口显示,这么可以确保你的APP一直多整屏显示。至于详细的代码实现请参考开发者文档。
在分屏模式下运行的应用一个例子,中间有一根黑色的嫌,拖动可以调整APP在屏幕上的大小:
增强通知功能
在Android N中,Google又抛弃了在L和M中的卡片式,Google重新设计了通知,使其更加易用并且速度更快。变更的内容包括:
- 模板更新:Google更新的通知模板中,更加注重整体样式和头像(hero image and avatar,我理解可能不太对,欢迎大家指正)。开发者只需调整少量的代码就能充分利用新模板。
- 消息样式自定义:你可以使用MessageStyle类自定义更多与你的通知相关的用户界面标签。你也可以配置消息、会话标题和内容视图。
- 捆绑通知:系统会将消息组合在一起(例如,按消息主题)并显示组。用户可以适当地进行Dismiss或Archive等操作。如果你在Android Wear已实现这样的通知,我想你已经很熟悉这种模式了。
- 直接回复:对于实时通信的App(类似微信、WhatsApp),Android N系统支持在通知栏直接回复,以便用户可以直接在通知界面中快速回复短信。
- 自定义视图:你可以使用两个新的API在通知中使用利用系统装饰元素自定义视图,如通知标题和操作。
具体如何实现新通知,请参阅通知指南。下面是快速回复的预览图。
快速回复1:
快速回复2:
快速回复3:
Profile-guided JIT/AOT编译
在Android N中,系统添加了Just in Time (JIT)编译器,对ART进行代码分析,让它可以在应用运行时持续提升Android应用的性能。JIT编译器对Android运行组件当前的Ahead of Time (AOT)编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。
Profile-guided编译让Android运行组件能够根据应用的实际使用以及设备上的情况管理每个应用的 AOT/JIT编译。例如,ART维护每个APP的热方法的profile,并且可以预编译和缓存这些方法以实现最佳性能。对于应用的其他部分,在实际使用之前不会进行编译。
除提升应用的关键部分的性能外,profile-guided编译还有助于减少整个 RAM占用,包括关联的二进制文件。此功能对于低内存设备尤其重要。
ART在管理profile-guided编译时,可最大程度降低对设备电池的消耗。仅当设备处于空闲状态或者充电时才进行编译,从而可以通过提前执行该工作节约时间和省电。
快速的应用安装路径
ART的JIT编译器最实际的好处之一是APP安装和系统更新的速度。即使在Android 6.0中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。因为省去了优化步骤,系统更新也变得更快。
随时随地低电耗模式
Android 6.0时就推出了低电耗模式,即设备处于空闲状态时,通过推迟应用的CPU和网络活动以实现省电目的的系统模式,比如,当设备放在桌子上或你的兜兜里时。
而在Android N中,低电耗模式又优化了一下,即任何时候都可以省电。只要屏幕关闭了一段时间,且设备没有插入电源,低电耗模式就会对应用使用熟悉的CPU和网络限制。它的意思就是说用户即使将设备放入兜兜里也可以省电。
低电耗模式适用于延长电池寿命,即使设备未是非静止状态:
屏幕关闭一会儿后,设备在使用电池时,低电耗模式将限制网络连接,同时延迟work和async。在短暂的维护时间范围后,系统会允许应用访问网络,并执行延迟的wrok和async。打开屏幕或将设备插入电源会使设备退出低电耗模式。
当设备再次处于静止状态时,屏幕关闭且使用电池一段时间,低电耗模式针对 PowerManager.WakeLock、AlarmManager警报和GPS/Wi-Fi扫描后申请禁用所有的全部CPU和网络。
调整APP的低电耗模式的最佳实践在移动设备和非移动设备上都是一样,因此,如果你已经更新了你的代码合理的处理了低电耗模式,那就没什么好说的。 如果没有,那可以你可以看官网的这篇文章将应用调整到低电耗模式。
项目瘦身(Project Svelte)——后台优化
Project Svelte在持续改善,在整个Android生态系统中最大程度的减少Android系统和App使用的RAM。在Android N中,Project Svelte特别侧重优化在后台运行的App。
后台处理是大多数App相当重要的一部分。处理的好,可以实现非常棒的用户体验——即时、快速和情境感知。如果处理不得当,后台处理会毫无必要地消耗RAM(和耗电),同时影响其他App的性能。
自Android 5.0发布以来,JobScheduler(作业调度器)已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以在安排Job的同时允许系统基于内存、电源和连接情况进行优化。JobScheduler可最简洁的实现后台最优控制,Google想要所有App都使用它,JobScheduler将会非常有利于系统的优化。以后我也会出一片关于具体代码实现的系列文章,届时欢迎大家关注。
另一个非常好的选择是 GCMNetworkManager(Google Play 服务的一部分),其在旧版Android中提供类似的Job安排和兼容性。
在Android N中Google继续扩展了JobScheduler和 GCMNetworkManager,以符合更多个用例——例如,现在开发者可以基于Content Providers
改变或者安排后台工作。同时,Android N也开始弃用了一些较旧的模式,这些被弃用的模式会降低系统性能,特别是低内存设备的系统性能。
在Android N中,删除了三个常用隐式广播——CONNECTIVITY_ACTION、ACTION_NEW_PICTURE和ACTION_NEW_VIDEO——因为这些广播可能会一次唤醒多个应用的后台进程,同时会耗尽内存和电池。如果你的App现在用到了这些广播,建议你利用Developer Preview调试JobScheduler,用JobScheduler方案是来替换上面的几个广播。
如需了解具体的代码实现详情,请查看后台优化文档。
SurfaceView
Android 7.0带来的同步移动SurfaceView类,它提供电池性能在某些情况下比TextureView更好:当渲染视频或3D内容、应用与滚动和移动视频位置时使用更加少的电。
SurfaceView被解析合成到屏幕上时更加省电(battery-efficient),因为它在专用硬件上被解析合成,和App
窗口上的其它内容是相互独立的。结果就是,它想比TextureView在被解析屏幕上的整个过程中消耗非常小。
SurfaceView
对象内容的位置是和App内容的位置同步更新的。这个改变的结果是简单的平移、缩放一个Video时不再产生黑条。
在Android7.0开始Google推荐我们使用SurfaceView
代替TextureView
。
Data Saver
在移动设备的整个声明周期中,移动流量(窝蜂数据)划的成本通常会超出设备本身的成本。对于许多用户来说,移动流量(窝蜂数据)是他们最想节约的一个成本。
Android N 推出了 Data Saver模式,这是一项新的系统服务,有助于减少应用使用的移动流量(窝蜂数据),无论是在漫游,账单周期即将结束,还是使用少量的预付费移动流量(窝蜂数据)包。 Data Saver让用户可以控制应用使用移动流量(窝蜂数据)的方式,同时让开发者打开 Data Saver时可以提供更多有效的其它服务。
当设备用移动流量(窝蜂数据)上网时,用户可以在Settings中启用Data Saver,系统会自动屏蔽后台流量消耗,同时通知运行在前台的尽可能使用较少的流量,比如通过限制流媒体服务使用的比特率、降低图片质量、延迟加载、预缓冲等方法来实现。用户可以将特定App加入白名单,这样可允许这些App在后台时使用流量,即使在打开Data Saver时也如是。
Android 7.0扩展了ConnectivityManager,用户可以用来检查Data Saver是否开启或者监听Data Saver的改变状态。 所有应用都应检查用户是否已启用Data Saver并努力限制前台和后台流量消耗。
Vulkan API
Android N将一项新的3D渲染APIVulkan™ 集成到平台中。就像 OpenGL™ ES一样,Vulkan是3D图形和渲染的开放标准,由 Khronos Group维护。
Vulkan从驱动器中最小化CPU开销,并且让你的App更直接地控制GPU操作。 Vulkan还允许多个线程同时执行工作来获得更好的并行化,如命令缓冲区构建。
Vulkan开发工具和库都已经在Android NDK。它们包括:
- Headers
- Validation layers (debug libraries)
- SPIR-V shader compiler
- SPIR-V runtime shader compilation library
Vulkan 仅适用于已启用Vulkan硬件的设备上的App,比如Nexus 5X、Nexus 6P和NexusPlayer。Google也正在和它的合作厂商积极的合作改善来支持更多的设备。
如需要了解更多信息,请参阅API 文档。
快速设置Title的API
“快速设置”通常用于简单直接的从通知栏显示关键设置和操作。在Android 7.0中已扩展“快速设置”的范围,更加方便和快速。
Google为其它的“快速设置”快提供了更多空间,用户可以像操作ViewPager
一样通过向左或向右滑动跨分页的显示区域访问它们。同时用户可以通过手指拖拽来控制需要显示哪些“快捷设置”和他们显示的位置。
对于开发者说,Android 7.0添加了一个新的API,从而让我们定义自己的“快速设置”图块,使用户可以轻松访问我们App中的关键控件和操作。也就是说我们可以像系统一样在通知懒下拉后在地方设置像系统一样的图标,让用户可以更加便捷的操作我们应用中的关键功能。
而且我们应该对于用户急需或者频繁使用的的操作使用“快捷设置”图块,并且不应该把“快捷设置”图块当作启动App的快捷方式。
我们在App内定义图块后,用户可以手动的拖放图块到通知栏。
如需创建应用图块的更多信息,请参阅可下载的API参考中的android.service.quicksettings.Tile
。
号码屏蔽
Android 7.0现在支持在平台中进行号码屏蔽,系统framework提供API,让服务提供商可以维护屏蔽的号码列表。 默认短信应用、默认手机应用和服务提供商应用可以对屏蔽的号码列表进行读取和写入操作。其他应用则无法访问此列表。
通过使号码屏蔽成为平台的标准功能,Android为App提供相同的方式来支持在不同的设备上的号码屏蔽。应用可以利用这个功能的其他优势包括:
- 屏蔽已屏蔽的来电号码发出的短信
- 通过Backup & Restore(备份和还原)功能可以在重置系统后和跨设备保留屏蔽的号码
- 多个应用可以使用相同的屏蔽号码列表
另外,在Android设备上的运营商App可以读取设备上屏蔽的号码列表,并为用户在服务端执行屏蔽,通过任何介质(如VOIP端点或转接电话)阻止用户不需要的来电和短信。
如需了解详细信息,请参阅可下载的API参考中的android.provider.BlockedNumberContract
。
来电过滤
Android 7.0 允许默认的手机App过滤来电。手机上的App具体操作的方式是实现新的CallScreeningService,该方法允许手机App基于来电的Call.Details执行大量操作,例如:
- 拒绝来电
- 不允许来电到达通话记录
- 不向用户显示来电通知
如需了解详细信息,请参阅可下载的API 参考中的android.telecom.CallScreeningService
。
多区域设置支持、多语言
Android 7.0现在允许用户在设置中选择多个区域设置,以更好地支持多语言。App可以使用新的API获取用户的当前的的区域设置,然后为多区域设置的用户提供更成熟的用户体验——例如以多个语言显示搜索结果,并且不会以用户了解的语言翻译网页。
除多区域设置支持外,Android 7.0还扩展了用户可用的语言的范围。它针对常用语言提供超过25种的变体,如英语、西班牙语、法语和阿拉伯语。它还针对100多种新语言添加了部分支持。
App可以通过调用LocaleList.GetDefault()
获取用户设置的区域设置列表。为支持扩展的区域设置数量,Android 7.0改变了解析资源的方式。请务必使用新的资源解析逻辑测试和验证你的App是否能如期运行。
如需有关新资源解析行为和应遵循的最佳做法的更多信息,请参阅多语言支持。
新增的表情符号(Emojis表情)
Android 7.0引入更多表情符号和表情符号相关功能,包括肤色表情符号和支持变量选择符。如果你的App支持表情符号,请遵循以下准则,以便能充分利用这些表情符号相关功能优势。
- 在插入之前,检查设备是否包含表情符号。 若要检查系统字体中有哪些表情符号,使用hasGlyph(String)方法。
- 检查表情符号是否支持变量选择符。变量选择符使您能够呈现一些彩色或黑白的表情符号。在移动设备上,应用应呈现彩色的表情符号,而不是黑白的。但是如果你的App在文本中嵌入表情符号,那你应该使用黑白变量。若要确定表情符号是否有变量,使用变量选择符。如需有关支持变量的字符的完整清单,请参阅变量的Unicode文档中的emoji variation sequences section(表情符号变量序列)部分。
- **检查表情符号是否支持肤色。**Android 7.0允许用户按照他们的喜好修改表情符号呈现的肤色。键盘应用应为有多个肤色的表情符号提供可视化的指示,并应允许用户选择他们喜欢的肤色。若要确定哪些系统表情符号有肤色修改器,使用hasGlyph(String)方法。 您可以通过读取Unicode文档来确定哪些表情符号使用肤色。
Android 中的 ICU4J API
Android 7.0目前在Android framework(位于android.icu软件包下)中提供ICU4J API的子集。迁移很简单,主要是需要从com.java.icu
命名空间更改为android.icu
。如果您已在您的应用中使用ICU4J
捆绑包,切换到Android framework中提供的android.icu API
可以很大程度上缩小apk的体积。
如果要了解有关 Android ICU4J API 的更多信息,请参阅ICU4J 支持。
WebView
WebView在各个系统中的支持不一样,是众多开发者吐槽的对象,在Android 7.0中终于优化这个View。
在Android 7.0中使用Chrome version 51
,当开发者启用多进程的WebView时,WebView讲运行在一个单独的沙箱中。
Google在以后的版本中会积极收录对WebView的兼容性和能行方面的问题,在Android 7.0这个版本开始WebView启动时间回归,使用的总的运行内存和网页渲染的性能。
如果开发者在多进程的模式下发现新的问题,大家可以提交到Google的Chrominum bug追踪器。
Javascript在加载页面之前运行
从Android 7.0开始,JavaScript上下文会在每一个新页面被加载时重置,目前的其它版本是在第一次加载html时在一个新的WebView的实例中加载,所以只要第一次加载后以后的所有页面都会有这个属性,在7.0中我们应该在每一次加载页面时重新加载一下我们JavaScript对象。
在不安全的来源定位
从Android 7.0开始,WebView中定位只能在安全的来源中使用(也就是https),这样做是为了保护用户的隐私信息,因为http是不安全的。
WebView现在还是在定期更新,所以我们可以使用WebView Beta(β)通道测试App兼容性。如要要在Android 7.0测试预发布版本的WebView,下载并安装Chrome开发版或者Chrome测试版,并选择它作为WebView的实现,Google的文档说他们的开发人员这么说的(一脸懵逼)。我们可以通过Chromium bug追踪器报告问题,Google会在新发布的WebView中修复我们反馈的问题。
OpenGL™ ES 3.2 API
Android 7.0添加了对OpenGL ES 3.2的framework接口平台支持,包括:
- 来自Android support(AEP)的所有扩展(EXT_texture_sRGB_decode 除外)。
- 针对 HDR 的浮点帧缓冲和延迟着色。
- BaseVertex绘图调用可实现更好的批处理和流媒体服务。
- 强大的缓冲区访问控制,可减少WebGL开销。
Android 7.0提供了适用于OpenGL ES 3.2
和GLES32
的framework API。使用OpenGL ES 3.2时,请务必在Manifest.xml中通过标记和android:glEsVersion声明属性。
如需了解有关使用 OpenGL ES 的信息,包括如何在运行时检查设备支持的 OpenGL ES 版本,请参阅OpenGL ES API 指南。
Android TV 录制
Android N通过新的录制API添加了从Android TV输入服务录制和播放内容的功能。构建是在现有的API上做了支持,TV 输入服务可以控制能够录制的渠道数据、保存录制的会话的方式,同时可通过录制的内容管理用户交互。
如需了解详细信息,请参阅Android TV 录制 API。
Android for Work
Android for Work针对运行Android N的设备添加了许多新功能和API。由于官网这部分时有更新,这里不做更细的介绍,请参阅Android for Work更新。
无障碍增强功能(人脸追踪、眼球追踪、点扫描)
Android N 现在针对新的设备设置直接在欢迎屏幕上提供“Vision Settings”。这使用户可以更容易发现和配置他们设备上的无障碍功能,包括放大手势、字体大小、显示屏尺寸和 TalkBack。
随着这些无障碍功能更为突出,在启用这些功能后,我们的用户可能更有可能使用App。发布App前请务必启用这些设置后测试你的App。 你可以通过Settings > Accessibility
启用它们。
还是在 Android N 中,无障碍服务现在可以帮助具有动作障碍的用户触摸屏幕。全新的 API允许使用人脸追踪、眼球追踪、点扫描等功能构建服务,以满足这些用户的需求。
如需了解详细信息,请参阅可下载的API 参考中的android.accessibilityservice.GestureDescription
。
直接启动
直接启动可以缩短设备启动时间,让注册的应用具有一些有限的功能,即使在意外重启后也是有效的。例如,如果当用户睡觉时加密的设备重启,那么注册的警报、消息和来电现在可以和往常一样继续通知用户。这也意味着重启后无障碍服务会立即可用。
在Android N中,直接启动充分利用基于文件的加密,对系统和App启用更加细化的加密策略。系统针对选定的系统数据和显式注册的应用数据使用设备加密的存储。默认情况下,凭据加密的存储可用于所有其他系统数据、用户数据、应用及应用数据。
启动时,系统在受限的模式中启动,仅访问设备加密的数据,不会对应用或数据进行常规访问。如果你的App的组件要在这个模式运行,你可以通过在清单文件中设置标记注册它们。重启后,系统通过广播LOCKED_BOOT_COMPLETED Intent
激活注册的组件。系统确保注册过的应用数据在解锁前可用。所有其他数据在用户确认锁定屏幕凭据进行解密前均不可用。
如需了解详细信息,请参阅直接启动。
密钥认证
使用硬件支持的密钥库,可更安全地在 Android设备上创建、存储和使用加密密钥。它们免受Linux内核、潜在的Android漏洞的攻击,也可防止从已取得根权限的设备提取密钥。
为了让硬件支持的密钥库使用起来更简单和更安全,Android N 引入了密钥认证。应用和关闭的设备可使用密钥认证来确定RSA或EC密钥对是否受硬件支持、密钥对
的属性是怎么样的,以及其使用和有效性有何限制。
应用和关闭的设备服务可以通过X.509认证证书(必须由有效的认证密钥签署)请求有关密钥对的信息。认证密钥是一个ECDSA签署密钥,它在出厂时被注入设备的硬件支持的密钥库。因此,有效的认证密钥签署的认证证书可确认硬件支持的密钥库是否存在,以及该密钥库中密钥对的详细信息。
为确保设备使用安全的官方Android出厂映像,密钥认证要求设备bootloader向可信执行环境(TEE)提供以下信息:
除密钥认证外,Android N 还推出了指纹绑定密钥,在指纹注册时不会撤销。
网络安全性配置
在Android N中,通过使用说明性“网络安全性配置”(而不是使用传统的易出错的编程API(例如,X509TrustManager
)),应用可以安全地自定义其安全(HTTPS、TLS)连接的行为,无需修改任何代码。
支持的功能:
- 自定义信任锚。让App可以针对安全连接自定义哪些证书颁发机构 (CA) 值得信赖。例如,信任特定的自签署证书或限制应用信任的公共CA集合。
- 仅调试重写。让App开发者可以安全调试其应用的安全连接,而不会增加安装基础的风险。
- 明文流量选择退出。让App可以防止自身意外使用明文流量。
- 证书固定。这是一项高级功能,让App可以针对安全连接限制哪些服务器密钥受信任。
如需了解详细信息,请参阅网络安全性配置。
默认受信任的证书颁发机构
默认情况下,针对Android 7.0的App仅信任系统提供的证书,且不再信任用户添加的证书颁发机构(CA)。 如果面向 Android 7.0的应用希望信任用户添加的CA,则应使用网络安全性配置以指定信任用户 CA 的方式。
APK signature scheme v2
Android 7.0 引入一项新的应用签名方案APK Signature Scheme v2
,它能让App更快速的安装,保护更多针对未授权APK文件的更改。在默认情况下,Android Studio 2.2
和Android Gradle 2.2
插件会使用APK Signature Scheme v2
和传统签名方案来签署您的应用。
虽然Google建议我们的App采用APK Signature Scheme v2
,但这项新方案并非强制性的。如果你的App在使用APK Signature Scheme v2
时不能正确构建,那么你可以不用。 不用这个方案的话Android Studio 2.2
和Android Gradle 2.2
插件仅使用传统签名方案来签署你的App。若要仅用传统方案签署,打开Module的build.gradle
文件,然后将行v2 SigningEnabled false
添加到您的版本签名配置中:
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
v2SigningEnabled false
}
}
}
注意:如果你使用
APK Signature Scheme v2
签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。 出于这个原因,如要你要使用zipalign工具的话,请在使用APK Signature Scheme v2
之前使用。
如需更多信息,请阅读介绍如何在 Android Studio 中签署一项应用以及如何使用 Android Gradle插件来为签署应用配置构建文件。
作用域目录访问
在 Android 7.0中,App可以使用新的API请求访问特定的外部存储目录,包括可移动媒体上的目录,如 SD卡。新API大大简化了应用访问标准外部存储目录的方式,如Pictures 目录。App(如图库)就可以使用这些API(而不是使用READ_EXTERNAL_STORAGE),它已经授予所有存储目录的访问权限,从而让用户可以导航到目录。
此外,新的API简化了用户向应用授予外部存储访问权限的步骤。当您使用新的API时,系统使用一个简单的权限UI,其清楚地详细介绍应用正在请求访问的目录。
关于运行时权限管理可以看我的这篇文章。
如需了解详细信息,请参阅作用域目录访问开发者文档。
键盘快捷键辅助工具
在Android 7.0中,用户可以按“Alt + /”
触发“键盘快捷键”窗口,它会显示系统和对焦的应用中可用的所有快捷键。这些快捷键是从应用菜单(如果有并可以用)中自动检索到的,但开发者可以提供自己的屏幕微调快捷键。您可以通过重写新 Activity.onProvideKeyboardShortcuts()
的方法来进行这项操作,如可下载的API参考中所述。
若要在你的App的任何地方主动触发键盘快捷键辅助工具,为相关Activity调用Activity.requestKeyboardShortcutsHelper()。
VR 支持
Android N 添加了新的VR模式的平台支持和优化,便于开发者能为用户打造高质量移动VR体验。新版针对开发者提供了大量性能增强特性,包括单一缓冲区渲染以及允许VR应用访问某个专属的CPU核心。在你的App中,您可以享受到专为 VR 设计的平滑头部跟踪和立体声通知功能。最重要的是,Android N的图形延时非常低。如需有关构建面向的Android 7.0的VR应用的完整信息,请参阅面向 Android 的 Google VR SDK。
打印服务增强
在 Android N 中,打印服务的开发者现在可以公开关于个别打印机和打印作业的其他信息。
在列出各打印机时,打印服务现在可以通过两种方式来设置按打印机的图标:
- 您可以通过调用
PrinterInfo.Builder.setResourceIconId()
设置源于资源 ID 的图标。 - 您可以通过调用
PrinterInfo.Builder.setHasCustomPrinterIcon()
,并针对使用android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon()
设置来自网络的图标。
此外,您还可以通过调用PrinterInfo.Builder.setInfoIntent()
根据打印机活动,显示其他相关信息。
您可以通过分别调用android.printservice.PrintJob.setProgress()
和android.printservice.PrintJob.setStatus()
在打印任务通知中指示打印任务的进度和状态。
如需有关这些方法的详细信息,请参阅可下载的API 参考。
FrameMetricsListener API
FrameMetricsListener API允许应用监测它的UI渲染性能。API通过公开流式传输Pub/Sub API
来提供此能力,以传递应用当前窗口的帧计时信息。返回的数据相当于adb shell
(https://developer.android.com/tools/help/shell.html#shellcommands) dumpsys gfxinfo framestats
显示的数据,但不限定于在过去的120帧内。
你可以使用FrameMetricsListener
来衡量生产中的交互级UI性能,而且不需要USB连接。API允许在比adb shell dumpsys gfxinfo
更高的粒度上收集数据。因为系统可以从应用中的特定交互中收集数据,因此更高的粒度变得可行;系统不需要采集关于完整应用性能的全局概要或清除任何全局状态。你可以使用这种能力来针对App的真实使用案例收集性能数据和捕捉UI性能回馈。
若要监测一个窗口,实现FrameMetricsListener.onMetricsAvailable()
callback方法,并在Window上注册。如需了解详细信息,请参阅可下载的API参考中的FrameMetricsListener
类文档。
API 提供了一个包含计时数据的FrameMetrics
对象,其渲染子系统会在一帧长度的声明周期内报告各种时间点。支持的指标有:UNKNOWN_DELAY_DURATION
、INPUT_HANDLING_DURATION
、ANIMATION_DURATION
、LAYOUT_MEASURE_DURATION
、DRAW_DURATION
、SYNC_DURATION
、COMMAND_ISSUE_DURATION
、SWAP_BUFFERS_DURATION
、TOTAL_DURATION
和FIRST_DRAW_FRAME
。
虚拟文件(Virtual Files)
在较早的Android系统版本中,你的App可以使用存储访问框架来允许用户从他们的云存储帐户中选择文件,如 Google 云端硬盘。但是,不能表示没有直接字节码表示的文件;每个文件都必须提供一个输入流。
Android 7.0在存储访问框架中增加了“虚拟文件”的概念。虚拟文件功能可以让您的DocumentsProvider
返回可与ACTION_VIEW
Intent使用的文件URI,即使它们没有直接字节码表示。Android 7.0还允许你给用户文件(虚拟或其他类)提供备用的格式。
为获得你App中的虚拟文件的URI,首先你应该创建一个Intent以打开文件选择器App。由于应用不能使用 openInputStream()
方法来直接打开一个虚拟文件,因此如果你添加了CATEGORY_OPENABLE
,那么你的App不会接收到任何虚拟文件。
在用户选择之后,系统会调用onActivityResult()
方法。你的App可以检索虚拟文件的URI,并得到一个输入流,这个一段事例代码:
// Other Activity code ...
final static private int REQUEST_CODE = 64;
// We listen to the OnActivityResult event to respond to the user's selection.
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
try {
if (requestCode == REQUEST_CODE &&
resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (resultData != null) {
uri = resultData.getData();
ContentResolver resolver = getContentResolver();
// Before attempting to coerce a file into a MIME type,
// check to see what alternative MIME types are available to
// coerce this file into.
String[] streamTypes =
resolver.getStreamTypes(uri, "*/*");
AssetFileDescriptor descriptor =
resolver.openTypedAssetFileDescriptor(
uri,
streamTypes[0],
null);
// Retrieve a stream to the virtual file.
InputStream inputStream = descriptor.createInputStream();
}
}
} catch (Exception ex) {
Log.e("EXCEPTION", "ERROR: ", ex);
}
}
如需有关访问用户文件的更多信息,请参阅存储访问框架指南。
如果想了解更多关于Android7.0的知识,可以阅读Android 7.0行为变化(官网同步翻译)。
版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com