相关链接
Android新特性与行为变更 官网
一、Android 4.4(KitKat,API Level:19)
行为变更
1.如果您的应用从外部存储空间读取...
您的应用在 Android 4.4 上运行时无法读取外部存储空间上的共享文件,除非您的应用具有 READ_EXTERNAL_STORAGE 权限。也就是说,没有此权限,您无法再访问 getExternalStoragePublicDirectory() 返回的目录中的文件。但是,如果您仅需要访问 getExternalFilesDir() 提供的您的应用特有目录,那么,您不需要 READ_EXTERNAL_STORAGE 权限。
2.如果您的应用使用 WebView...
在 Android 4.4 上运行时,您的应用的行为会有所不同,将应用的 targetSdkVersion 更新为“19”或更高版本时尤其如此。
WebView 类的底层代码和相关 API 已升级为基于现代的 Chromium 源代码快照。这会带来各种性能提升,同时为新的 HTML5 功能和远程调试 WebView 内容提供支持。
3.如果您的应用使用 AlarmManager...
将您的应用的 targetSdkVersion 设置为“19”或更高版本时,您使用 set() 或 setRepeating() 创建的闹铃将变得不准确。
为提高电源效率,Android 现在批处理在合理的相似时间发生的所有应用的闹铃,以便系统仅唤醒设备一次,而不是多次唤醒设备来处理每个闹铃。
如果您的闹铃没有与精确的时钟时间关联,但您的闹铃仍必须在特定时间范围(例如,在下午 2 点至 4 点之间)触发,那么您可以使用新的 setWindow() 方法,其接受闹铃的“最早”时间以及最早时间之后的一个时间“窗口”,在这个窗口内,系统应触发闹铃。
如果您的闹铃必须固定到一个精确的时钟时间(例如,日历事件提醒),那么您可以使用新的 setExact() 方法。
新特性
1.可重复使用的位图
可以重复使用 BitmapFactory 中的任意可变位图来解码任何其他位图,即使新位图具有不同的尺寸也无妨,只要生成的已解码位图的字节计数(可通过 getByteCount() 获取)小于或等于分配的已重用位图的字节计数(可通过 getAllocationByteCount() 获取)即可。
2.存储访问框架
Android 4.4 引入了 ACTION_OPEN_DOCUMENT 操作,其允许用户选择特定类型的文件并授予应用对该文件的长期读取权限(可能也授予写入权限),无需向您的应用导入此文件。
如果您要开发为文件提供存储服务(如云保存服务)的应用,可以加入这个统一的 UI,通过实现一个内容提供程序作为新 DocumentsProvider 类的子类来选取文件。您的 DocumentsProvider 的子类必须包含一接受 PROVIDER_INTERFACE 操作 ("android.content.action.DOCUMENTS_PROVIDER") 的 intent 过滤器。然后,您必须在 DocumentsProvider 中实现四个抽象方法:
- queryRoots():此方法必须使用 DocumentsContract.Root 中定义的列返回一个描述文档存储空间的所有根目录的 Cursor。
- queryChildDocuments():此方法必须使用 DocumentsContract.Document 中定义的列返回一个描述指定目录中的所有文件的 Cursor。
- queryDocument():此方法必须使用 DocumentsContract.Document 中定义的列返回一个描述指定文件的 Cursor。
- openDocument():此方法必须返回一个表示指定文件的 ParcelFileDescriptor。用户选择了文件,并且客户端应用通过调用 openFileDescriptor() 请求对该文件的访问权限后,系统便会调用此方法。
3.沉浸式全屏模式
要为您的应用提供填充整个屏幕的布局,适用于 setSystemUiVisibility() 的新标记 SYSTEM_UI_FLAG_IMMERSIVE(与 SYSTEM_UI_FLAG_HIDE_NAVIGATION 结合使用时)将启用新的沉浸式全屏模式。在启用沉浸式全屏模式后,您的 Activity 将继续接收所有触摸事件。用户可以沿着系统状态栏正常出现的区域向内滑动来显示系统状态栏。这将清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 标记(如果应用了 SYSTEM_UI_FLAG_FULLSCREEN 标记,也会清除该标记),因此系统状态栏保持可见状态。但是,如果您想要系统状态栏在片刻后再次隐藏,可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 标记。
4.透明系统状态栏
您可以使用新主题背景 Theme.Holo.NoActionBar.TranslucentDecor 和 Theme.Holo.Light.NoActionBar.TranslucentDecor 将系统状态栏设置为部分透明。通过启用透明系统状态栏,您的布局将填充系统状态栏后面的区域,因此,您也必须为不应被系统状态栏覆盖的布局部分启用 fitsSystemWindows。
如果您要创建自定义主题背景,则将其中某个主题背景设置为父主题背景,或在您的主题背景中添加 windowTranslucentNavigation 和 windowTranslucentStatus 样式属性。
5.增强的通知侦听器
Android 4.3 添加了 NotificationListenerService API,从而允许应用在系统发布新通知后接收有关新通知的信息。在 Android 4.4 中,通知侦听器可以检索通知的附加元数据,并填写有关通知操作的详细信息:
新增的 Notification.extras 字段包含一个 Bundle,以向您的通知生成器提供 EXTRA_TITLE 和 EXTRA_PICTURE 等附加元数据。新增的 Notification.Action 类定义附加到通知的操作的特性,您可以从新的 actions 字段中检索这些特性。
二、Android 5.0(Lollipop,API Level:21)
行为变更
1.Android Runtime (ART)
在 Android 5.0 中,ART 运行时取代 Dalvik 成为平台默认设置。
部分主要的新功能包括:
- 预先 (AOT) 编译
- 改进的垃圾回收 (GC)
- 改进的调试支持
2.通知锁定屏幕可见性
默认情况下,在 Android 5.0 中,通知现在显示在用户的锁定屏幕上。用户可以选择保护敏感信息不被公开,在此情况下,系统会自动删减通知显示的文本。要自定义此删减的通知,请使用 setPublicVersion()。
如果通知不包含个人信息,或者您想允许媒体播放控件显示在通知上,则调用 setVisibility() 方法并将通知的可见性级别设为 VISIBILITY_PUBLIC。
3.浮动通知
当设备处于活动状态时(即,设备未锁定且其屏幕已打开),通知可以显示在小型浮动窗口中(也称为“浮动通知”)。这些通知看上去类似于精简版的通知,只是浮动通知还显示操作按钮。用户可以在不离开当前应用的情况下处理或清除浮动通知。
4.getRecentTasks()
为提升用户隐私的安全性,现已弃用 ActivityManager.getRecentTasks() 方法。如果您的应用使用此方法检索它自己的任务,则改用 getAppTasks() 检索该信息。
5.绑定到服务需要显式 Intent
Context.bindService() 方法现在需要显式 Intent,如果提供隐式 intent,将引发异常。为确保应用的安全性,请使用显式 intent 启动或绑定 Service,且不要为服务声明 intent 过滤器。
6.WebView
如果您的应用是面向低于 21 的 API 级别:
- 系统允许混合内容和第三方 Cookie,并始终一次渲染整个文档。
如果您的应用是面向 API 级别 21 或更高级别:
- 默认情况下,系统会阻止混合内容和第三方 Cookie。要允许混合内容和第三方 Cookie,请分别使用 setMixedContentMode() 和 setAcceptThirdPartyCookies() 方法。
- 系统现在可以智能地选择要绘制的 HTML 文档部分。这个新的默认行为有助于减少内存占用和提升性能。如果您要一次渲染整个文档,可通过调用 enableSlowWholeDocumentDraw() 停用此优化。
7.自定义权限唯一性要求
从 Android 5.0 开始,对于使用不同密钥签名的应用,系统会强制执行新的自定义权限唯一性限制。现在,设备上只有一个应用可以定义给定的自定义权限(按其名称确定),除非定义此权限的其他应用使用相同密钥签名。如果用户尝试安装的应用具有重复自定义权限且签名密钥不同于定义此权限的驻留应用,则系统将阻止安装。
新特性
1.Material Design 支持
Android 5.0 添加了对 Android 的新 Material Design 样式的支持。您可以创建具有 Material Design 功能的应用,实现动态视觉效果,利用其中的 UI 元素转换赋予用户自然的感觉。此支持包括:
- Material Design 主题
- 视图阴影
- RecyclerView 小部件
- 可绘制动画和造型效果
- Material Design 动画和 Activity 转换效果
- 针对基于视图状态的视图属性的动画生成器
- 可自定义的 UI 小部件和具有可由您控制的调色板的应用栏
- 基于 XML 矢量图形的动画和非动画可绘制对象
2.最近使用的应用屏幕中的并发文档和 Activity
在之前的版本中,最近使用的应用屏幕只能为最近与用户交互过的每个应用显示一项任务。现在,您的应用可以根据需要为其他并发文档 Activity 打开更多任务。此功能简化了多任务处理,通过在所有应用中提供一致的切换体验,让用户能够在最近使用的应用屏幕中的各个 Activity 和文档之间快速切换。
为插入逻辑换行符以便系统将您的 Activity 视为新任务,请在使用 startActivity() 启动 Activity 时使用 FLAG_ACTIVITY_NEW_DOCUMENT。您还可以通过在清单中将
为避免使最近使用的应用屏幕变得混乱,您可以在应用中设置该屏幕中可显示的任务数上限。要实现此目的,请设置
可将最近使用的应用屏幕中的任务设置为在重启后保留。要控制持久化行为,请使用 android:persistableMode 属性。您还可以通过调用 setTaskDescription() 方法,更改 Activity 在最近使用的应用屏幕中的视觉属性,如 Activity 的颜色、标签和图标。
3.WebView 更新
Android 5.0 将 WebView 实现更新至 Chromium M37,增强了安全性和稳定性,并修复了一些问题。运行在 Android 5.0 上的 WebView 的默认用户代理字符串已更新,以纳入 37.0.0.0 作为版本号。
此版本引入了 PermissionRequest 类,让您的应用可以通过 getUserMedia() 等网络 API 授予 WebView 访问相机和麦克风之类受保护资源的权限。您的应用必须对这些资源拥有相应的 Android 权限,才能向 WebView 授予权限。
借助新的 onShowFileChooser() 方法,您现在可以在 WebView 中使用输入表单字段,然后启动文件选择器从 Android 设备中选择图像和文件。
4.媒体回放控制
使用新增的通知和媒体 API 可确保系统 UI 了解您的媒体回放情况,并可提取和显示专辑封面。现在,可以利用新增的 MediaSession 类和 MediaController 类更轻松地在整个 UI 和服务范围内控制媒体回放。
5.媒体浏览
Android 5.0 引入了通过新增的 android.media.browse API 让应用能够浏览其他应用媒体内容库的功能。要公开您应用内的媒体内容,请扩展 MediaBrowserService 类。您实现的 MediaBrowserService 应提供对 MediaSession.Token 的访问权限,以便应用能播放通过您的服务提供的媒体内容。
要与媒体浏览器服务交互,请使用 MediaBrowser 类。在您创建 MediaBrowser 实例时为 MediaSession 指定组件名称。然后,您的应用便可利用该浏览器实例连接到关联的服务并获得 MediaSession.Token 对象,以播放通过该服务公开的内容。
6.存储目录选择
Android 5.0 扩展了存储访问框架,允许用户选择整个目录子树,从而授予应用对所含全部文档的读/写权限,无需用户逐项确认。
要选择目录子树,请生成并发送一个 OPEN_DOCUMENT_TREE intent。系统会显示所有支持子树选择的 DocumentsProvider 实例,并允许用户浏览和选择目录。返回的 URI 代表对所选子树的访问权限。然后,您就可以使用 buildChildDocumentsUriUsingTree() 和 buildDocumentUriUsingTree() 以及 query() 来探索子树。
新增的 createDocument() 方法允许您在该子树下的任何位置新建文档或目录。要管理现有文档,请使用 renameDocument() 和 deleteDocument()。检查 COLUMN_FLAGS 以验证提供程序是否支持这些调用,然后再发出调用。
如果您要实现 DocumentsProvider 并想支持子树选择,请实现 isChildDocument() 并在您的 COLUMN_FLAGS 中加入 FLAG_SUPPORTS_IS_CHILD。
7.计划排定作业
Android 5.0 新增了一个 JobScheduler API,允许您定义一些系统在稍后或指定条件下(如设备充电时)以异步方式运行的作业,从而优化电池寿命。下列情形下,作业计划排定功能很有用:
- 应用具有不面向用户并且可以推迟的作业
- 应用具有您更愿意在设备插入电源时再进行的作业
- 应用具有一项需要接入网络或连接 WLAN 的任务。
- 应用具有多项您希望定期以批处理方式运行的任务。
- 一个作业单位由一个 JobInfo 对象封装。该对象指定计划排定标准。
使用 JobInfo.Builder 类可配置应如何运行已排计划的任务。您可以安排任务在特定条件下运行,例如:
- 在设备充电时启动
- 在设备连入无限流量网络时启动
- 在设备空闲时启动
- 在特定期限前或以最低延迟完成
三、Android 6.0(Marshmallow,API Level:23)
行为变更
1.运行时权限
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的 requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。
2.取消支持 Apache HTTP 客户端
Android 6.0 版移除了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 HttpURLConnection 类。此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
3.通知
此版本移除了 Notification.setLatestEventInfo() 方法。请改用 Notification.Builder 类来构建通知。要重复更新通知,请重复使用 Notification.Builder 实例。调用 build() 方法可获取更新后的 Notification 实例。
adb shell dumpsys notification 命令不再打印输出您的通知文本。请改用 adb shell dumpsys notification --noredact 命令打印输出 notification 对象中的文本。
四、Android 7.0(Nougat,API Level:24)
行为变更
1.在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
新特性
1.多窗口支持
在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持。现在,用户可以一次在屏幕上打开两个应用。
2.配置文件指导的 JIT/AOT 编译
在 Android 7.0 中,我们添加了即时 (JIT) 编译器,对 ART 进行代码分析,让它可以在应用运行时持续提升 Android 应用的性能。JIT 编译器对 Android 运行组件当前的 Ahead of Time (AOT) 编译器进行了补充,有助于提升运行时性能,节省存储空间,加快应用更新和系统更新速度。
3.快速的应用安装路径
Android 运行组件的 JIT 编译器最实际的好处之一是应用安装和系统更新的速度。即使在 Android 6.0 中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。系统更新也变得更快,因为省去了优化步骤。
4.随时随地低电耗模式
Android 6.0 推出了低电耗模式,即设备处于空闲状态时,通过推迟应用的 CPU 和网络活动以实现省电目的的系统模式,例如,设备放在桌上或抽屉里时。
现在,在 Android 7.0 中,低电耗模式又前进了一步,随时随地可以省电。只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的 CPU 和网络限制。这意味着用户即使将设备放入口袋里也可以省电。
屏幕关闭片刻后,设备在使用电池时,低电耗模式将限制网络访问,同时延迟作业和同步。在短暂的维护时间范围后,其允许应用访问网络,并执行延迟的作业/同步。打开屏幕或将设备插入电源会使设备退出低电耗模式。
5.后台优化
后台处理是大多数应用的一个重要部分。处理得当,可让您实现非常棒的用户体验 — 即时、快速和情境感知。如果处理不得当,后台处理会毫无必要地消耗 RAM(和电池),同时影响其他应用的系统性能。
自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。JobScheduler 可实现控制和简洁性,我们想要所有应用都使用它。
在 Android 7.0 中,我们删除了三个常用隐式广播 — CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO — 因为这些广播可能会一次唤醒多个应用的后台进程,同时会耗尽内存和电池。如果您的应用收到这些广播,请充分利用 Android 7.0 以迁移到 JobScheduler 和相关的 API。
6.SurfaceView
Android 7.0 可同步移动到 SurfaceView 类,此类在某些情况下提供的电池性能优于 TextureView:在渲染视频或 3D 内容时,包含滚动和动画视频位置的应用在使用 SurfaceView 时比 TextureView 耗电更少。
SurfaceView 类可减少屏幕合成对电池的消耗,因为它是在专用硬件中合成,与应用窗口内容分隔开。因此,它产生的中间副本少于 TextureView。
现在,SurfaceView 对象的内容位置和包含的应用内容同步更新。这一变化导致的一个结果是,在画面移动时,SurfaceView 中播放的视频的简单的平移或缩放不再在画面侧面产生黑条。
从 Android 7.0 开始,我们强烈建议您使用 SurfaceView 代替 TextureView,以实现省电。
7.默认受信任的证书颁发机构
默认情况下,面向 Android 7.0 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。如果面向 Android N 的应用希望信任用户添加的 CA,则应使用网络安全性配置以指定信任用户 CA 的方式。
8.APK signature scheme v2
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
9.作用域目录访问
在 Android 7.0 中,应用可以使用新的 API 请求访问特定的外部存储目录,包括可移动媒体上的目录,如 SD 卡。新 API 大大简化了应用访问标准外部存储目录的方式,如 Pictures 目录。应用(如照片应用)可以使用这些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有存储目录的访问权限或存储访问框架,从而让用户可以导航到目录。
此外,新的 API 简化了用户向应用授予外部存储访问权限的步骤。当您使用新的 API 时,系统使用一个简单的权限 UI,其清楚地详细介绍应用正在请求访问的目录。