Android 7.0 Nougat(牛轧糖)---对开发者来说

android 7.0出来了。让你的app准备迎接最新的android版本吧,支持节省电量和内存,这样新的系统行为。使用多窗口UI、直接恢复通知以及其他操作来扩展你的app。

android 7.0介绍了各种各样的新功能给用户和开发者, 本文重点介绍面向开发者的一些新功能。

确保检查android 7.0的行为变化,了解有关平台的变化可能会影响你的app。

如果要了解更多的关于用户的新功能,请查看www.android.com。

1.支持多窗口

在android 7.0中,我们介绍了在支持多窗口平台上的一个多任务处理的新功能。

现在,用户可以一次在屏幕上打开两个应用。

在手机和平板上运行7.0,用户可以并排运行两个应用,或者一个应用位于另一个应用之上在分屏模式的时候。 用户可以通过拖动两个应用之间的分隔线来调整app大小。

在android TV上的设备,app可以将自身置于画中画模式。当用户浏览或者与其他app交互的时候,允许它们继续显示内容。

尤其是在平板上和大屏的设备上,多窗口支持为你提供新的吸引用户的方式。你甚至能够让你的应用进行拖放,用户可以方便的把内容拖到你的应用,或者从中拖出内容,这是一个非常好的增强用户体验的方式。

它是简单的为你的app添加多窗口支持,并配置它如何处理多窗口显示。例如,你可以指定activity允许的最小尺寸,从而防止用户将activity调整到该尺寸以下。你也可以在你的app中禁止多窗口显示,确保系统将仅以全屏模式显示你的app。

关于更多的信息,请查看Multi-Window Support的开发者文档。

2.通知功能的增强

在android 7.0我们重新设计了通知,让它们更加容易和快速的被使用。以下是一些改变的地方。

(a)模板的更新,我们正在更新的通知模板,强调了英雄的头像和化身。开发者将能够利用新的模板,在代码中做最小的调整。

(b)消息样式的自定义,你能够自定义很多和通知相关的用户界面的标签,使用MessagingStyle类。你可以配置消息,会话标题,内容视图。

(c)绑定通知,系统能够把一组消息放在一起,例如,按照主题消息,显示这个组。用户可以适当地进行Dismiss或Archive等操作。如果你已实现Android Wear的通知,那么你已经很熟悉此模式。

(d)直接回复,对于实时通信app,android系统支持内嵌的回复,用户可以直接快速响应一个短消息或文本消息,直接在通知接口。

(e)自定义视图,两个新的API让你在通知中使用自定义视图时可以充分利用系统装饰元素,如通知标题和操作。

3.介绍JIT / AOT编译

在android 7.0中,我们添加了Just in Time (JIT) 编译器,对ART 进行代码分析,它能不断的提高android app的运行性能。JIT编译器对android运行组件当前的Ahead of Time (AOT) 编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。

配置编译器让ART管理AOT/JIT编译每一个app根据实际使用,以及设备上的条件。例如,ART保持着每一个app热门方法的简介,并且可以预编译和缓存这些方法以实现最佳性能。对于应用的其他部分,在实际使用之前不会进行编译。

除了提高app的性能是关键部分。简介编译器帮助减少app的内存占用,包括相关的二进制文件。这个功能对于降低设备的内存是很重要的。

ART管理profile-guided编译时,在最大程度上降低对设备电池的影响。仅当设备处于空闲状态和充电时才进行编译,节约时间和电量通过提前执行该工作。

4.快速的app安装路径

ART JIT编译的一个最明显的好处是提高app安装和系统更新的速度。在android 6.0中即使是大型的app,也要求几分钟来优化安装的,但是现在只需要几秒钟。系统更新也变的很快,自从它不需要优化了。

5.休眠情况下…

android 6.0介绍休眠机制,通过推迟app的cpu和网络活动来实现省电目的的系统模式,当设备空闲的时候,例如设备放在桌上或抽屉里时。

现在在android 7.0时,休眠机制又前进了一步,随时随地的节省电量。任何时候只要屏幕关闭了一段时间,并且设备也没有插电,休眠就会应用到这个app熟悉的CPU和网络限制的子集。这意味着用户节省电量,当他们将设备放入口袋里的时候。

这里写图片描述

当设备在使用电池时,屏幕关闭片刻后,休眠模式限制网络访问,同时延迟作业和同步。在维持着短暂的窗口期间,应用允许网络访问,并执行延迟的作业/同步的作业。打开屏幕或者将设备插入电源会使设备退出休眠模式。

当设备再次静止时,屏幕关闭且使用了电池一段时间。休眠模式应用整个cpu和网络限制在PowerManager.WakeLock, AlarmManager闹钟和GPS/Wi-Fi扫描。

无论设备移动与否,将app在休眠模式的最佳适配是相同。所以,如果你已经更新了你的app,优雅的处理了休眠模式,则一切就绪。如果没有,请看adapting your app to Doze文档。

6.Project Svelte:后台优化

瘦身计划在持续的优化,尽可能的减少系统和app对RAM的使用,在安卓设备的生态系统的范围内。在Android 7.0中,瘦身计划注重优化app在后台运行的方式。

后台处理是大多数app的一个重要部分。处理得当,它能够让用户感觉非常神奇,即时地、快速地和有感知力地。处理不得当,后台处理会不必要地消耗内存(包括电量),同时影响其他app的系统性能。

从Android 5.0开始,JobScheduler已成为执行后台工作的首选方式,其工作方式有利于用户。app可以在安排工作的同时允许系统基于内存、电源和连接情况进行优化。 JobScheduler 可实现控制和简洁性,我们想要所有的app都使用它。

另一个非常好的选择是GCMNetworkManager,Google Play Services的一部分,提供类似工作调度,能够很好的兼容在旧的安卓版本。

我们持续扩展JobScheduler和GCMNetworkManager,满足更多的用户案例。例如,在Android 7.0中,你能够立即安排后台工作,基于可变化的内容提供程序。在同一时间,我们开始反对一些旧的模式,如降低系统性能,特别是低内存设备。

在7.0中,我们移除掉来三个隐式广播, CONNECTIVITY_ACTION(网络变化)、ACTION_NEW_PICTURE(相机、拍照、图片)、and ACTION_NEW_VIDEO(ship)。因为这些广播可能会一次性唤醒多个app的后台进程,同时会耗尽内存和电池。如果你的app接收来这些广播,请例如Android 7.0的优势,迁移到JobScheduler上,用相关的API来代替。

想要了解更详细的信息,请看Background Optimizations文档。

7.SurfaceView

Android 7.0带来了同步运动的类SurfaceView。提供了在某些情况下比TextureView更好的电池性能,当渲染视频或者3D视频时,app滚动和切换视频位置是,使用SurfaceView比TextureView更省电量。

SurfaceView类在屏幕的影像合成上有更好的电池效率。因为它是复合的专用硬件,分离了app窗口内容。因此,它中间的复制比TextureView更少。

一个SurfceView对象的内容位置现在同步更新到app所包含的内容。这个变化的结果是:简单的移动或者缩放一个视频,如果用的是SurfaceView,将不会在view的边上产生黑色的进度条。

从Android 7.0开始,我们强烈推荐,你要省电的话用SurfaceView代替TextureView。

8.Data Saver(数据保护)

在移动设备的生命周期内,蜂窝数据计划的成本通常超过设备本身的成本。 对于更多用户来说,蜂窝数据是一个昂贵的资源,是他们想要保存。

Android 7.0介绍了数据保护模式。一个新的系统服务,能够帮助app减少蜂窝数据的使用。无论是在计费周期结束时的漫游,还是少量的预付费数据包。数据保护给用户控制哪个app使用蜂窝数据,同时让开发者打开Data Saver时,可以提供更多有效的服务。

这里写图片描述

当一个用户在设置里面启用了Data Saver,就可以在设备上计算网络流量。系统封锁了后台数据的使用,同时在前台的信号app尽可能减少数据的使用,例如限制流的比特率,降低图片质量,延迟预先的高速缓冲。用户能设置一个特殊的app白名单,允许后台计算流量使用,即使是Data Saver打开的时候。

Android 7.0扩展了ConnectivityManager类,可以让app检索用户的Data Saver首选项和监控首选项变更。所有的app应该检查用户是否开启了Data Saver,尽力限制前台和后台数据的使用。

9.Vulkan API

Android 7.0集成了Vulkan,一个3D渲染的API。像OpenGL ES一样,Vulkan 是 3D 图形和渲染的一项开放标准,由 Khronos Group 维护。

Vulkan是被设计成最小化的驱动CPU的开销,允许应用程序直接地控制CPU的操作。Vulkan也有更好的并行化,允许多个线程执行工作,如命令缓冲区构建一次。

Vulkan开发工具和依赖都在Android 7.0的NDK中,他们包括:

1.头

2.验证层(调试库)

3.SPIR-V着色编译器

4.SPIR-V运行时着色器编译库

Vulkan只适合已启用Vulkan硬件的设备上的应用,如Nexus 5X,Nexus 6P,Nexus Player。我们和合作伙伴正在紧密合作,尽可能带来更多的关于Vulkan的设备。

关于更多信息,请看API documentation。

10.快速设置Tile API

快速设置是一个很普遍地和简单地显示设置按钮和一些其他行为的功能,直接从通知栏下拉。在android 7.0中,我们扩展了快速设置的范围大小,让它更富有适用性和方便性。

我们增加了更多的空间来添加快速设置的图块,用户可以向左或者向右滑动,随意翻阅来显示它们。我们也可以让用户来控制哪些快速设置图块的显示–用户可以添加删除这些图块,通过拖动和放下他们。

对于开发者来说,android 7.0也增加了一些新的API,让你能够定义自己的快速设置图块,给用户能够很容易的访问他们的应用,通过这个图块来控制、操作它们。

快速设置图块保留了控制和行为,它们是急切的要求和频繁的使用,应该不被使用快捷键来运行app。

一旦你定义了你的图块,你可以让他们显示给用户看,可通过拖放将图块添加到快速设置。

关于更多的创建一个app图块的信息,请看Tile文档。

这里写图片描述

11.号码拦截

android 7.0平台上现在已经支持号码拦截了,提供了一个framework的API,让服务提供者维护一个号码拦截的列表。默认的是SM这个app,这个自带的app能够往号码拦截列表中读写数据。这个列表不能够被其他app访问。

通过使号码屏蔽成为平台的标准功能,android提供了一致的做法,在广泛的设备上让app支持号码拦截。app能够利用以下的这些好处:

1.能够拦截电话,也能够拦截短信

2.通过Backup & Restore(备份和还原)功能可以跨重置和设备上保留屏蔽的号码

3.多个应用可以使用相同的屏蔽号码列表

此外,通过自带app的集成,意味着这个app可以读取屏蔽号码列表在android的设备和平台上,服务商屏蔽掉他们,以阻止不需要的来电和短信,如 VOIP 端点或转接电话。

关于更多的信息,请看BlockedNumberContract文档。

12.Call Screening(呼叫过滤)

android 7.0 允许默认的手机应用程序来过滤来电。这个电话app做到这些是实现了新的CallScreeningService,允许手机app执行一个打电话的动作,基于一个到来的电话Call.Details,像这样:

1.拒绝来电

2.不允许来电到通话记录

3.不向用户显示来电通知

关于更多信息,请查看CallScreeningService文档。

13.Multi-locale Support, More Languages(多区域、语言支持)

android 7.0能够让用户在设置里面选择multiple locales,能够更好的支持双语言的用例。app能够使用一个新的API,获取用户选择的区域,然后为多区域设置用户提供更成熟的用户体验–如显示多语言的搜索结果,不会以用户知道的语言翻译网页。

随着多区域的支持,android 7.0也扩展了用户可用的语言范围。它支持超过25中常用的语言变体,如英语、西班牙语、法语和阿拉伯语。它还支持超过100种新语言。

app能够得到一个区域设置的列表,用户通过调用LocaleList.GetDefault()方法。 为支持扩展的区域设置数量,android 7.0正在改变解决资源文件的方式。确保你能够测试核实你的app如你期望的那样运行,用新的资源解析逻辑。

学习新的资源解决的行为,有一些训练测试,请看Multilingual Support。

14.New Emojis(新表情)

android 7.0添加了表情和表情符号相关的功能,包括换肤和支持变量选择符。如果你的app支持表情, 跟着参考资料,了解表情功能带来的好处。

1.在插入之前,检查设备是否包含表情符号。如果要检查系统字体中有哪些表情,可以用hasGlyph(String)方法。

2.检查表情符号是否支持变量选择符。变量表情符号允许你显示某些表情的颜色单一或者是黑白色。一个移动设备,app应该显示彩色的表情比黑白的好点。然而,如果你的app在文本中加入了表情,那它应该使用黑白变量。为了确定表情是否有变化,使用一个变量选择器。对于这个变量完整的字符串列表,阅览表情变量序列章节,请看Unicode documentation on variations文档。

3.检查表情符号是否支持换肤。android 7.0允许用户按照他们的喜好修改表情符号的肤色。键盘app应该提供视觉显示,有多个肤色可供用户选择。如果要确定系统有哪些表情符号肤色可以修改的话,可以使用 hasGlyph(String)方法。你要确定哪些表情符号使用肤色,请看Unicode documentation文档。

15.ICU4J APIs in Android

android 7.0现在提供了ICUJ API的子集,在android framework的 android.icu 包下。迁移到它是很容易的。最主要的是改变 com.java.icu 命名空间为 android.icu 。如果你在你的app中已经使用了ICU4J捆绑包,切换到android framework中的android.icu的API,可以减少你apk包的大小。

关于更多的ICU4J APIs,请看 ICU4J Support。

16.WebView

1.Chrome + WebView, Together

从android 7.0和Chrome浏览器版本51开始,你设备中的Chrome apk将被提供和渲染给android系统的WebViews来使用。到目前为止,这个方式改善了系统内存的使用,也减少了保持WebView的频带宽度的要求。(作为独立的WebView apk将不再更新,只要保留Chrome浏览器就行)

在开发者选项WebView implementation中,你可以选择WebView的提供商。你可以使用任何一款兼容的Chrome浏览器版本 (Dev, Beta or Stable),安装在你的设备上,或者用实现WebView的独立WebView apk。

2.Multiprocess(多进程)
从android 7.0和Chrome浏览器版本51开始,WebView将运行web内容在一个分离的沙盒线程中,当开发者启用“Multiprocess WebView”选项时。

我们正在寻找资料在兼容性和运行时的性能,能够在未来的android版本上运行多进程的WebView。在这个版本上,回归启动时间,总的内存使用,软件预计渲染的性能。

如果在多进程模式中发生了意想不到的问题,我们想听到这些。如果有问题,请在Chromium bug tracker上面和WebView团队沟通。

3.Javascript run before page load

在android7.0上运行一个app,javascript的context将会被重置,当一个新的页面加载时。一般地,context通过第一个页面的加载携带到一个新的WebView实例。

开发者可以通过在javascript上注入javascript,在页面已经加载后,应该执行该脚本。

4.Geolocation on insecure origins(在不安全的来源定位)

在android7.0上运行一个app,定位的API只允许在安全的来源,这个方案的设计是为了保护用户的隐私信息,当他们使用不安全的连接时。

5.Testing with WebView Beta

WebView定期更新,所以我们推荐你测试下app使用了WebView Beta版的兼容性,在android 7.0上测试WebView的释放版本,下载安装Chrome的开发版和Chrome的Beta版,选择它作为WebView的实现,在开发者选择的描述下面。请在Chromium bug tracker 上面报告问题,我们将修复问题,并且发布一个新的WebView版本。

17.OpenGL™ ES 3.2 API

android 7.0添加了新的framework API来支持OpenGL ES 3.2,包括:

1.除了EXT_texture_sRGB_decode之外,扩展了所有的 Android Extension Pack。

2.针对 HDR 的浮点帧缓冲和延迟着色。

3.BaseVertex 绘图调用可实现更好的批处理和流媒体服务。

4.强大的缓冲区访问控制可减少 WebGL 开销。

OpenGL ES 3.2的API和GLES32一起被提供。当使用 OpenGL ES 3.2时,一定要在清单文件中声明< uses-feature >标签和android:glEsVersion属性。

关于OpenGL ES的更多信息,包括设备在运行时检查是否支持OpenGL ES,请看OpenGL ES API guide文档。

18.Android TV Recording(Android TV 录制)

android 7.0增加了新录制API,可以录制和重播从android TV输入服务获取的内容。构建在现有时移 API 之上,TV输入服务能够控制渠道数据被录制,怎样让会议记录被保存,通过录制内容可以管理用户之间的交互。

更多信息,请看Android TV Recording APIs。

19.Android for Work

在运行android 7.0时,android的工作添加了新的功能和API。下面是一些重要的内容–完整的改变列表,请看Android for Work Updates。

1.Work profile security challenge(工作资料的安全挑战)

面向 N SDK 的个人资料所有者可以为在工作资料中运行的app指定单独的安全性挑战。当用户试图打开任何一个app,这个工作挑战将被展示。成功地完成安全挑战,解锁工作文件,并破解它,如果是需要的话。对于资料的所有者,ACTION_SET_NEW_PASSWORD 提示用户设置一个工作挑战,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 提示用户设置一个设备锁。

资料所有者针对工作挑战设置特别的密码,通过使用 setPasswordQuality(),setPasswordMinimumLength()和相关的方法。(例如:PIN 必须多长,或者是否可以使用指纹解锁个人资料)。资料所有者也可以设置设备所,用过使用DevicePolicyManager 实例,返回它并调用 getParentProfileInstance()方法。此外,资料所有者可以针对工作挑战设置自定义凭据屏幕,通过使用setOrganizationColor() 和 setOrganizationName()方法。

2.Turn off work(关闭工作)

在一个有工作概况的设备上,用户能够开关这个工作模式。当工作模式关闭的时候,管理用户的功能临时关闭,禁用工作资料app,后台同步,通知。它包括资料所有者的应用程序。当关闭工作模式时,系统显示永久状态图标,以提醒用户他们无法启动工作应用。启动器指示这个工作app和组件无法访问。

20.Always on VPN(总是打开VPN)

设备的所有者和个人资料的所有者,要确定工作的app总是连接到指定的VPN,在设备boot的时候,系统自动开始启用该VPN。

新的DevicePolicyManager方法有setAlwaysOnVpnPackage()getAlwaysOnVpnPackage()

因为VPN服务能够直接绑定系统,而不和app交互,VPN客户端需要针对 Always on VPN处理新的进入点。和以前一样,服务能够指定系统,通过intent-filter的action匹配android.net.VpnService

用户也能够设置Always on VPN客户端,实现VPNService的方法,在设置里操作Settings>More>Vpn。只有API 24才能在设置里开启这个选项。

21.Customized provisioning(自定义配置)

一个应用程序可以用公司颜色和图标,来自定义配置文件所有者和设备所有者。
DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR 定义流程的颜色,DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI 定义流程的公司图标。

22.Accessibility Enhancements(无障碍功能加强)

android 7.0 现在支持视觉设置,在一个新设备启动的欢迎界面,可以直接设置。对用户来说,在设备上可以很简单的发现和配置无障碍功能,包括放大手势,字体大小,显示大小和对讲系统。

随着这些无障碍功能更为突出,在开启这些功能后,你的用户可能更喜欢你的app。确保在开启无障碍功能下,测试过你的app。你可以在设置的Settings > Accessibility。

在android 7.0中,无障碍服务可以帮助有运动障碍的用户触摸屏幕。新的 API 允许使用人脸追踪、眼球追踪、点扫描等功能构建服务,以满足这些用户的需求。

关于更多的信息,请看GestureDescription文档。

23.Direct Boot(直接启动)

直接启动改善来设备的启动时间,让注册的应用程序具有有限的功能,即使在机器意外重启后。例如,当用户睡觉的时候,一个加密设备重启,设备注册来闹钟,短信,来电,在重启后能正常通知用户。这也意味着无障碍服务在重启后可以立即使用。

在android 7.0中,直接启动充分利用文件加密技术,针对系统和应用数据启用细粒度的加密策略。该系统使用一个加密设备存储选择的系统数据和指定注册的应用程序数据。在默认情况下,证书加密的存储可用于所有其他系统数据,用户数据,应用及应用数据。

在启动时,系统在受限的模式下开始,并且只能访问加密设备的数据,不能访问一般的应用和数据。如果你有想在此模式下运行的组件,你可以通过在清单文件设置一个flag,来注册它们。在重启后,系统激活注册的其他数据是不能用的,直到用户得到证书解密,并且锁定屏幕。

关于更多信息,请看 Direct Boot。

24.Key Attestation(密钥认证)

android 7.0引入了密钥认证,一个新的安全工具,可以帮助你确保密钥存储在设备的硬件支持密钥库中,紧密的保护来应用程序的用户的私人信息。通过使用这个工具,从应用程序和驻留在安全硬件中的密钥的交互中,你能够获取额外的信任,甚至root过的设备也可以运行你的应用程序。如果你的应用程序使用从硬件支持的密钥库中的密钥,你应该使用这个工具,尤其是你使用这个密钥来核实你应用程序的私有信息。

密钥认证允许你核实RSA 或者 EC 密钥是否被创建和存储在设备的硬件支持密钥库中,在设备的可信执行环境下(TEE)。该工具也允许你使用关闭设备服务,如你应用程序的后端服务器,确定并有力地验证密钥对的使用和有效性。这个功能提供了一个额外的安全级别,来保护密钥对,甚至某些人root了设备,或者破解来安卓平台的运行安全。

注意:只有一小部分设备运行在android 7.0上支持硬件级别的密钥认证,所有的其他设备运行在android 7.0用软件级别的密钥认证代替。在你核实产品级别环境中的硬件支持密钥库的属性时,你应该确保设备支持硬件支持的密钥库。这样做,你应该检查证书链是否包含root证书,该证书是有Googleroot证书密钥和attestationSecurityLevel元素下签名的,key description数据结构设置了TrustedEnvironment 的安全级别。

关于更多信息,请看 Key Attestation 文档。

25.Network Security Config(网络安全配置)

在android 7.0中,应用程序能够安全地自定义他们的安全连接行为,而不需要代码修改,通过使用Network Security Config,而不是使用传统的易出错的编程API。(例如: X509TrustManager)

支持一下功能:

1.自定义信任点。 让一个应用程序自定义哪个官方证书(CA)是信任的安全连接。例如,信任特定的自签署的证书,或者限制公共的官方证书。

2.仅调试覆盖。 让开发者安全的调试一个安全的连接,而不会增加安装基础的风险。

3.明文流量选择退出。让应用可以防止自身意外使用明文流量。

4.证书固定。这是一项高级功能,让应用可以针对安全连接限制哪些服务器密钥受信任。

关于更多信息,请看 Network Security Config文档。

26.Default Trusted Certificate Authority(默认信任的证书机构)

默认情况下,在android 7.0上的应用程序只信任系统提供的证书,而不再信任用户添加的证书机构。。 如果在android 7.0上的app希望信任用户添加的CA,则应使用Network Security Config 指定信任用户CA。

27.APK Signature Scheme v2(apk签名方案v2)

android 7.0引入了v2的apk签名方案,一个新的app签名方案,它提供了更快的app安装时间和更多针对未授权 APK 文件更改的保护。默认情况下,android studio 2.2和android gradle 插件2.2,他们都能使用v2和传统的签名方式来签名你的应用程序。

虽然我们推荐使用v2的apk签名方案,这个新方案不是强制的。当使用v2的签名方案时,如果你的应用程序不能正确的构建,你就可以放弃这个新方案。禁用过程会导致 Android Studio 2.2 和 Android Gradle 2.2 插件只能够使用传统签名方案来签署你的应用程序。对于只使用传统方式来签名,打开build.gradle文件,在你的释放版本的签名配置中添加v2SigningEnabled false。

  android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }

警告: 如果你使用v2来签名你的应用程序,并对应用进一步修改,则app签名将无效。因为这个原因,请在使用v2签名之前,使用zipalign工具,而不是之后使用。

关于更多信息,请阅读介绍如何在 Android Studio 中签名一个app,以及如何使用 Android Gradle 插件来为签名app配置build文件。

28.Scoped Directory Access(作用域的目标访问)

在android 7.0中,app能够使用新的API来要求访问指定的额外的存储目录,包括可移动媒体上的目录,如 SD 卡。这个新的API大大地简化了应用程序怎样去访问标准的外部存储目录,比如相册目录。照片app使用这些API,而不用READ_EXTERNAL_STORAGE,授权访问所有的存储目录,或者存储访问框架,让用户可以导航到该目录。

此外,这个新的API简化了用户授权访问外部存储的步骤。当你使用这个新的API时,系统使用一个简单的权限UI,清楚详细地介绍app正在请求访问的目录的信息。

关于更多信息,请看Scoped Directory Access文档。

29.Keyboard Shortcuts Helper(键盘快捷键帮助)

在android 7.0中,用户可以按下Meta + 触发键盘快捷键屏幕,显示系统和获得焦点的app所有可用的快捷键。系统会自动从app菜单中检索出快捷键,如果快捷键存在的话。你也能够提供你自己调整的快捷键列表,你可以通过重写onProvideKeyboardShortcuts() 来做到这些。

注意: Meta 键现在不是所有的键盘上都有,在苹果公司的键盘上,它是Command 键;在Windows键盘上,它是Windows 键;在 Pixel C和 Chrome OS 键盘上,它是Search 键。

你可以在应用程序的任何地方触发键盘快捷键帮助,在相关Activity中调用requestShowKeyboardShortcuts()方法。

30.Custom Pointer API(自定义指针API)

android 7.0引入了自定义指针API,让你可以自定指针外观,可见度,行为。这个功能是很有用的,当用户使用鼠标或者触摸板和UI对象进行交互的时候。默认的指针使用一个标准的图标。该API也包括一些高级功能,如改变指针的显示图标,在鼠标或者触摸板移动的时候。

为了设置指针的图标,重写View类的 onResolvePointerIcon()方法。该方法使用PointerIcon对象绘制出图标,来对应于一个特定的事件运动。

31.Sustained Performance API(持续性的API)

长期运行的app的性能可能波动的比较明显,因为系统会阻止系统芯片下设备组件的温度限制。这个波动显示的目的是开发者创建了一个高性能,长期运行的app。

为了解决这些局限性,android 7.0支持了持续的性能模式,启用OEMs 提供关于长期运行应用的设备性能能力的提示。开发者能够使用这些提示来预测的大部分设备性能水平,以调整长期应用。

开发者可以在Nexus 6P设备上尝试这些API。为了使用这些功能,设置持续的性能窗口标志,你想要运行持续的性能模式。设置这个标志位使用Window.setSustainedPerformanceMode() 方法。当窗口丢失焦点时,系统会自动禁用该模式。

32.VR Support(VR支持)

android 7.0增加了新的VR模式的平台支持和优化,让开发者可以构建一个高质量的VR体验给用户。有大规模的性能增强,包括VR app可以访问特有的cpu核心。在你的app内部,你可以获得智能头部跟踪和立体声通知的功能。更重要的是,android 7.0提供了非常低的图形延迟。

关于在android 7.0构建一个完整的VR app,请看Google VR SDK for Android文档。

33.Print Service Enhancements(打印服务增强)

在android 7.0 中,打印服务开发者可以公开个人打印机和打印作业的一些信息。

当列出个人打印机列表,一个打印服务现在能够设置两种每台打印机图标。

1.你可以通过调用setIconResourceId()方法来设置源于资源 ID 的图标

2.你能够显示一个图标从网络上,通过setHasCustomPrinterIcon()方法,设置一个回调当图标被请求的时候,通过onRequestCustomPrinterIcon()方法。

此外,你能够提供每台打印机的行动,显示额外的信息,通过 setInfoIntent()方法。

你可以用一个进度显示打印机工作的状态,可以分别通过 setProgress() 和 setStatus()方法来通知打印工作。

34.Frame Metrics API

画面计算API允许app监视UI渲染性能。API提供了一个功能,暴露Pub/Sub流 API转换成一帧的时间,在app的当前窗口。这个数据的返回与使用 adb shell dumpsys gfxinfo framestats命令的显示是一样的,但不限定于在过去的 120 帧内。

你能够使用帧计算API来测试UI性能的交互级别,而不需要usb连接。该API允许收集细粒度的数据,调用 adb shell dumpsys gfxinfo 命令。细粒度可能因为系统需要采集app特别交互的数据;系统不需要采集关于完整应用性能的全局概要,或者清除任何全局状态。你可以使用这个功能来针对app的真实使用案例收集性能数据和捕捉回归UI性能。

为了监视一个窗口,实现OnFrameMetricsAvailableListener.onFrameMetricsAvailable() 回调方法,并在窗口里面注册它。

该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。

35.Virtual Files(虚拟文件)

在以前的android版本,用户能够使用Storage Access Framework 来允许用户从他们的云存储帐户中选择文件,如: Google Drive。但是,没有方法来表示文件,通用一个直接的字节码来表示,每个文件都被要求提供一个输入流。

android 7.0在Storage Access Framework里面增加来虚拟文件的概念。虚拟文件功能允许你的DocumentsProvider返回一个文档的Uri,可以通过意图的 ACTION_VIEW 来使用,即使他们不能直接用字节码表示。android 7.0也允许你对用户文件提供备份,虚拟,或者其他的。

应用程序得到虚拟文档的URI,首先,你要创建一个Intent来打开文件选择器。由于app不能够直接打开虚拟文档,通过使用openInputStream() 方法。你的app不能够接收任何虚拟文件,如果你包含CATEGORY_OPENABLE属性的话。

最后,用户要做一个选择,系统会调用 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);
      }
  }

关于访问用户文件的更多信息,请看 Storage Access Frameworks guide文档。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值