API 级别:21
Android 5.0 (LOLLIPOP) 为用户和应用开发者提供了新功能。本文旨在介绍其中最值得关注的新 API。
如果您有已发布的应用,请务必查看您应该在应用中考虑的 Android 5.0 行为变更。这些行为变更可能会影响您的应用在 Android 5.0 设备上的应用,即使您没有使用新的 API 或未开发新功能也是如此。
如需详细了解新平台功能,请参阅 Android Lollipop 重要内容。
开始开发
要着手开发 Android 5.0 应用,您必须先获取 Android SDK。然后使用 SDK 管理器下载 Android 5.0 SDK Platform 和系统映像。
更新目标 API 级别
如需针对搭载 Android 5.0 的设备进一步优化您的应用,请将 targetSdkVersion
设置为 "21"
,在 Android 5.0 系统映像上安装您的应用并进行测试,然后发布更新了此变更的应用。
您可以通过在代码中添加条件,在执行您的 minSdkVersion
不支持的 API 之前检查系统 API 级别,实现在使用 Android 5.0 API 的同时仍为旧版本提供支持。如需详细了解如何保持向后兼容性,请参阅支持不同平台版本。
如需详细了解 API 级别的运作方式,请参阅什么是 API 级别?
重要的行为变更
如果您之前发布过 Android 应用,请注意您的应用可能受到 Android 5.0 变化的影响。
如需了解完整信息,请参阅 Android 5.0 变更。
界面
Material Design 支持
Android 5.0 添加了对 Android 的新 Material Design 样式的支持。您可以创建具有 Material Design 功能的应用,实现动态视觉效果,利用其中的界面元素转换赋予用户自然的感觉。此支持包括:
- Material Design 主题
- 视图阴影
RecyclerView
widget- 可绘制动画和造型效果
- Material Design 动画和 Activity 转换效果
- 针对基于视图状态的视图属性的动画生成器
- 可自定义的 UI 小部件和具有可由您控制的调色板的应用栏
- 基于 XML 矢量图形的动画和非动画可绘制对象
如需详细了解如何为您的应用添加 Material Design 功能,请参阅 Material Design。
最近使用的应用屏幕中的并发文档和 Activity
在之前的版本中,最近使用的应用屏幕只能为最近与用户交互过的每个应用显示一项任务。现在,您的应用可以根据需要为其他并发文档 activity 打开更多任务。此功能简化了多任务处理,通过在所有应用中提供一致的切换体验,让用户能够在最近使用的应用屏幕中的各个 activity 和文档之间快速切换。此类并发任务的示例可能包括网络浏览器应用中打开的标签页、效率应用中的文档、游戏中并发的比赛或即时通讯应用中的聊天。您的应用可以通过 ActivityManager.AppTask
类管理其任务。
如需插入逻辑换行符以便系统将 activity 视为新任务,请在使用 startActivity()
启动 activity 时使用 FLAG_ACTIVITY_NEW_DOCUMENT
。您还可以通过在清单中将 <activity> 元素的 documentLaunchMode
属性设置为 "intoExisting"
或 "always"
来获得此行为。
为了避免“最近使用的应用”屏幕变得杂乱,您可以在应用中设置该屏幕中显示的任务数上限。为此,请设置 <application> 属性 android:maxRecents
。目前可指定的上限为每位用户 50 个任务(RAM 较低设备为 25 个)。
可以将“最近使用的应用”屏幕中的任务设置为在重新启动后保留。如需控制持久化行为,请使用 android:persistableMode 属性。您还可以通过调用 setTaskDescription()
方法,在“最近使用的应用”屏幕中更改 activity 的视觉属性,如 activity 的颜色、标签和图标。
WebView 更新
Android 5.0 将 WebView
实现更新至 Chromium M37,增强了安全性和稳定性,并修复了一些 bug。运行在 Android 5.0 上的 WebView
的默认用户代理字符串已更新,以纳入 37.0.0.0 作为版本号。
此版本引入了 PermissionRequest
类,让您的应用可以通过 getUserMedia() 等 Web API 授予 WebView
访问相机和麦克风之类受保护资源的权限。您的应用必须对这些资源拥有相应的 Android 权限,才能向 WebView
授予权限。
借助新的 onShowFileChooser()
方法,您现在可以在 WebView
中使用输入表单字段,然后启动文件选择器从 Android 设备中选择图像和文件。
此外,此版本还支持 WebAudio、WebGL 和 WebRTC 开放标准。如需详细了解此版本中包含的新功能,请参阅 WebView for Android。
屏幕采集和共享
Android 5.0 引入了新的 android.media.projection
API,让您可以为应用添加屏幕截图和屏幕共享功能。例如,如果您想在视频会议应用中启用屏幕共享,便可使用此功能。
新的 createVirtualDisplay()
方法允许您的应用将主屏幕(默认屏幕)的内容捕获到 Surface
对象中,然后您的应用便可以将其发送到整个网络。该 API 仅允许捕获非安全屏幕内容,不允许捕获系统音频。如需开始截取屏幕,您的应用必须先使用通过 createScreenCaptureIntent()
方法获得的 Intent
启动屏幕截图对话框,请求用户授予权限。
如需查看新 API 使用方法的示例,请参阅示例项目中的 MediaProjectionDemo
类。
通知
锁定屏幕通知
Android 5.0 中的锁定屏幕可以显示通知。用户可以通过设置选择是否允许在安全的锁定屏幕上显示敏感的通知内容。
您的应用可以控制在安全锁定屏幕上显示的通知中可见信息的详细程度。如需控制可见性级别,请调用 setVisibility()
并指定以下值之一:
VISIBILITY_PRIVATE
:显示通知图标等基本信息,但隐藏通知的完整内容。VISIBILITY_PUBLIC
:显示通知的完整内容。VISIBILITY_SECRET
:不显示任何内容,甚至不包括通知图标。
当可视性级别为 VISIBILITY_PRIVATE
时,您还可以提供隐藏个人详情的删减版通知内容。例如,短信应用可能会显示一条通知,指出“您有 3 条新短信”,但是隐藏了短信内容和发件人。如需提供此备用通知,请先使用 Notification.Builder
创建备用通知。创建专用通知对象时,请通过 setPublicVersion()
方法为其附加替换通知。
通知元数据
Android 5.0 使用与您的应用通知关联的元数据,以更智能的方式对通知排序。如需设置元数据,请在构建通知时调用 Notification.Builder
中的下列方法:
setCategory()
:告知系统如何在设备处于“优先”模式时处理应用通知(例如,通知代表来电、即时通讯还是闹钟)。setPriority()
:标记通知的重要性程度高于或低于普通通知。 如果优先级字段设置为PRIORITY_MAX
或PRIORITY_HIGH
的通知还有声音或振动,则会显示在小型浮动窗口中。addPerson()
:可让您添加一位或多位与通知相关的用户。 您的应用可以使用此名单指示系统应将来自指定人员的通知归为一组,或者将这些人员发出的通知视为更重要。
图形
对 OpenGL ES 3.1 的支持
Android 5.0 添加了 Java 接口和对 OpenGL ES 3.1 的原生支持。OpenGL ES 3.1 中提供的重要新功能包括:
- 计算着色器
- 单独的着色器对象
- 间接绘制命令
- 多重采样和模板纹理
- 着色语言改进
- 用于高级混合模式和调试的扩展程序
- 向后兼容 OpenGL ES 2.0 和 3.0
Android 上 OpenGL ES 3.1 的 Java 接口随 GLES31
提供。使用 OpenGL ES 3.1 时,请确保使用 <uses-feature>
标记和 android:glEsVersion
属性在清单文件中声明它。例如:
<manifest> <uses-feature android:glEsVersion="0x00030001" /> ... </manifest>
如需详细了解如何使用 OpenGL ES(包括如何在运行时检查设备支持的 OpenGL ES 版本),请参阅 OpenGL ES API 指南。
Android 扩展包
除了 OpenGL ES 3.1 之外,此版本还提供了一个扩展包,其中包括 Java 接口和对高级图形功能的原生支持。Android 将这些扩展视作单个软件包。(如果存在 ANDROID_extension_pack_es31a
扩展,您的应用可以假设该软件包中的所有扩展都存在,并通过单个 #extension
语句启用着色语言功能。)
该扩展包支持:
- 有保证的着色器存储缓冲区、图像和原子 Fragment 着色器支持(在 OpenGL ES 3.1 中,Fragment 着色器支持是可选的)。
- 镶嵌和几何着色器
- ASTC (LDR) 纹理压缩格式
- 每采样内插和着色
- 帧缓冲区中每个颜色附件采用不同混合模式
该扩展包的 Java 接口随 GLES31Ext
提供。在您的应用清单中,您可以将应用声明为必须安装在支持该扩展包的设备上。
例如:
<manifest> <uses-feature android:name=“android.hardware.opengles.aep” android:required="true" /> ... </manifest>
媒体
用于高级相机功能的 Camera API
Android 5.0 引入了新的 android.hardware.camera2 API 来简化精细照片采集和图像处理。您现在可以使用 getCameraIdList()
以编程方式访问可供系统使用的摄像头设备,并使用 openCamera()
连接到特定设备。如需开始拍摄图片,请创建一个 CameraCaptureSession
并指定用于发送已拍摄图片的 Surface
对象。CameraCaptureSession
可以配置为进行单张或多张连拍。
如需在拍摄新图片时收到通知,请实现 CameraCaptureSession.CaptureCallback
监听器,并在拍摄请求中进行设置。现在,当系统完成图像采集请求时,您的 CameraCaptureSession.CaptureCallback
监听器会收到对 onCaptureCompleted()
的调用,并在 CaptureResult
中为您提供图像采集元数据。
CameraCharacteristics
类可让您的应用检测设备上可用的相机功能。对象的 INFO_SUPPORTED_HARDWARE_LEVEL
属性表示相机的功能级别。
- 所有设备都至少支持
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
硬件级别,该级别具有的能力大致与已废弃的Camera
API 相当。 - 支持
INFO_SUPPORTED_HARDWARE_LEVEL_FULL
硬件级别的设备能够手动控制拍摄和后期处理,以及以高帧速率拍摄高分辨率图片。
如需了解如何使用更新后的 Camera API,请参阅此版本中的 Camera2Basic
和 Camera2Video
实现示例。
音频播放
此版本包含对 AudioTrack
的以下更改:
- 您的应用现在可以提供浮点格式 (
ENCODING_PCM_FLOAT
) 的音频数据。这样可以实现更大的动态范围、更一致的精度和更大的余量。浮点算法在进行中间计算时特别有用。回放端点为音频数据使用位深度更低的整型格式。 (在 Android 5.0 中,内部管道的某些部分尚未采用浮点格式。) - 您的应用现在可以提供音频数据作为
ByteBuffer
,数据使用的格式与MediaCodec
提供的格式相同。 WRITE_NON_BLOCKING
选项可简化某些应用的缓冲和多线程处理。
媒体回放控制
使用新的通知和媒体 API 可确保系统界面了解媒体播放情况,并可以提取并显示专辑封面。现在,可以利用新增的 MediaSession
和 MediaController
类更轻松地在整个界面和服务范围内控制媒体回放。
新的 MediaSession
类取代了已废弃的 RemoteControlClient
类,提供了一组用于处理传输控件和媒体按钮的回调方法。如果您的应用提供媒体播放,并运行在 Android TV 或 Wear 平台上,请使用 MediaSession
类,通过同样的回调方法来处理您的传输控制。
现在,您可以使用新增的 MediaController
类开发自己的媒体控制器应用。该类可通过您的应用的界面进程,以线程安全方式监控和控制媒体回放。创建控制器时,请指定一个 MediaSession.Token
对象,以便您的应用可与给定 MediaSession
交互。通过使用 MediaController.TransportControls
方法,您可以发送 play()
、stop()
、skipToNext()
和 setRating()
等命令来控制该会话上的媒体播放。对于控制器,您还可以注册一个 MediaController.Callback
对象来监听会话中的元数据和状态变化。
此外,您还可以利用新增的 Notification.MediaStyle
类创建允许将回放控制与媒体会话绑定的丰富通知。
媒体浏览
Android 5.0 引入了通过新增的 android.media.browse API 让应用能够浏览其他应用媒体内容库的功能。如需公开应用中的媒体内容,请扩展 MediaBrowserService
类。您的 MediaBrowserService
实现应提供对 MediaSession.Token
的访问权限,以便应用可以播放通过您的服务提供的媒体内容。
如需与媒体浏览器服务交互,请使用 MediaBrowser
类。创建 MediaBrowser
实例时,为 MediaSession
指定组件名称。然后,您的应用就可以通过使用该浏览器实例连接到关联的服务并获取 MediaSession.Token
对象,以播放通过该服务公开的内容。
存储
目录选择
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
。
Android 5.0 还在共享存储空间上引入了新的软件包专属目录,您的应用可在其中放置供加入到 MediaStore
中的媒体文件。新的 getExternalMediaDirs()
会返回所有共享存储设备上这些目录的路径。与 getExternalFilesDir()
类似,您的应用无需额外权限便可访问返回的路径。平台会定期扫描这些目录中的新媒体,但您也可以使用 MediaScannerConnection
明确扫描是否有新内容。
无线和连接
多个网络连接
Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。当您的应用需要 SUPL、彩信或运营商计费网络等专业化网络时,或者您想使用特定类型的传输协议发送数据时,就可以使用此功能。
如需从应用以动态方式选择并连接到网络,请按以下步骤操作:
- 创建
ConnectivityManager
。 - 使用
NetworkRequest.Builder
类创建一个NetworkRequest
对象,并指定您的应用感兴趣的网络功能和传输类型。 - 如需扫描合适的网络,请调用
requestNetwork()
或registerNetworkCallback()
,并传入NetworkRequest
对象和ConnectivityManager.NetworkCallback
的实现。如果您想在检测到合适的网络后主动切换到该网络,请使用requestNetwork()
方法;如需仅接收已扫描网络的通知而不主动切换,请改用registerNetworkCallback()
方法。
当系统检测到合适的网络时,它会连接到该网络并调用 onAvailable()
回调。您可以使用回调中的 Network
对象来获取有关该网络的更多信息,或者引导流量使用所选网络。
蓝牙低功耗
Android 4.3 为发挥核心作用的蓝牙低功耗 (Bluetooth LE) 引入了平台支持。在 Android 5.0 中,Android 设备现在可以充当蓝牙 LE 外围设备。应用可以利用此功能让附近设备发现它。例如,您可以开发这样的应用:让设备发挥计步器或健康监测仪的作用,并与其他蓝牙 LE 设备进行数据通信。
借助新的 android.bluetooth.le
API,您的应用可以广播通告、扫描响应以及与附近的蓝牙 LE 设备建立连接。如需使用新的广告和扫描功能,请在清单中添加 BLUETOOTH_ADMIN
权限。当用户更新您的应用或从 Play 商店下载您的应用时,系统会请求他们向您的应用授予以下权限:“蓝牙连接信息:允许该应用控制蓝牙,包括向附近的蓝牙设备广播或获取其相关信息。”
如需启动蓝牙 LE 广播,以便其他设备能够发现您的应用,请调用 startAdvertising()
并传入 AdvertiseCallback
类的实现。回调对象会收到广播操作成功或失败的报告。
Android 5.0 引入了 ScanFilter
类,让您的应用可以只扫描其感兴趣的特定类型设备。如需开始扫描蓝牙 LE 设备,请调用 startScan()
并传入过滤条件列表。在方法调用中,您还必须提供 ScanCallback
的实现,以便在发现蓝牙 LE 通告时进行报告。
NFC 增强功能
Android 5.0 添加了以下增强功能,让您能够更广泛、更灵活地使用 NFC:
- Android Beam 现在会显示在分享菜单中。
- 您的应用可以通过调用
invokeBeam()
来调用用户设备上的 Android Beam,以分享数据。这样一来,用户无需手动将设备触碰另一台支持 NFC 的设备即可完成数据传输。 - 您可以使用新的
createTextRecord()
方法创建一条包含 UTF-8 文本数据的 NDEF 记录。 - 如果您要开发付款应用,现在可以通过调用
registerAidsForService()
动态注册 NFC 应用 ID (AID)。您还可以使用setPreferredService()
来设置应在特定 activity 位于前台时使用的首选卡模拟服务。
Volta 项目
除了提供新功能外,Android 5.0 还重视电池续航时间的改善。您可以使用新的 API 和工具来了解和优化应用的功耗。
计划排定作业
Android 5.0 新增了一个 JobScheduler
API,允许您定义一些系统在稍后或指定条件下(如设备充电时)以异步方式运行的作业,从而优化电池续航时间。下列情形下,作业计划排定功能很有用:
- 应用具有不面向用户并且可以推迟的作业
- 应用具有您希望在设备接通电源时执行的工作。
- 应用具有一项需要接入网络或连接 WLAN 的任务。
- 应用具有多项您希望定期批量运行的任务。
一个工作单元由一个 JobInfo
对象封装。该对象指定计划排定标准。
使用 JobInfo.Builder
类可配置应如何运行已排计划的任务。您可以安排任务在特定条件下运行,例如:
- 在设备充电时启动
- 在设备连入无限流量网络时启动
- 在设备空闲时启动
- 在特定期限前或以最低延迟完成
例如,您可以添加如下代码,以便在不按流量计费的网络上运行您的任务:
Kotlin
val uploadTask: JobInfo = JobInfo.Builder( jobId, serviceComponent /* JobService component */ ).run { setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) build() } val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler jobScheduler.schedule(uploadTask)
Java
JobInfo uploadTask = new JobInfo.Builder(jobId, serviceComponent /* JobService component */) .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(uploadTask);
如果设备有稳定的电源(即设备已接通电源超过 2 分钟,且电池处于健康水平),系统将运行任何已准备好运行的已安排作业,即使作业的截止时间尚未过。
如需查看如何使用 JobScheduler
API 的示例,请参阅此版本中的 JobSchedulerSample
实现示例。
电池使用开发者工具
新的 dumpsys batterystats
命令会生成关于设备电池用量的有趣统计数据,这些数据按唯一用户 ID (UID) 进行整理。统计数据包括:
- 电池相关事件的历史记录
- 设备的全局统计信息
- 每个 UID 和系统组件的大致用电量
- 每个应用的每数据包移动毫秒数
- 系统 UID 汇总统计信息
- 应用 UID 汇总统计信息
使用 --help
选项来了解各种输出定制选项的相关信息。例如,如需输出自设备上次充电后给定应用软件包的电池用量统计信息,请运行以下命令:
$ adb shell dumpsys batterystats --charged <package-name>
您可以使用 Battery Historian 工具对 dumpsys
命令的输出进行检查,以根据日志生成 HTML 格式的用电相关事件。这些信息可让您更轻松地了解和诊断任何电池相关问题。
工作场所和教育领域中的 Android
托管配置
Android 5.0 提供了用于在企业环境内运行应用的新功能。如果用户已有个人账号,则设备管理员可以启动受管配置过程,以向设备添加共存但独立的受管理资料。与受管理个人资料关联的应用与非受管理应用一并出现在用户的启动器、最近使用的应用屏幕和通知中。
如需启动托管配置流程,请在 Intent
中发送 ACTION_PROVISION_MANAGED_PROFILE
。如果调用成功,系统会触发 onProfileProvisioningComplete()
回调。
然后您就可以调用 setProfileEnabled()
来启用此托管配置文件。
默认情况下,受管理个人资料中只有一小部分应用处于启用状态。您可以通过调用 enableSystemApp()
在受管理个人资料中安装其他应用。
如果您要开发启动器应用,可以使用新增的 LauncherApps
类获取可为当前用户启动的 activity 以及任何关联的受管配置文件的列表。您的启动器可以通过向可绘制图标附加工作标记,在视觉上突出显示受管理的应用。如需检索带徽章的图标,请调用 getUserBadgedIcon()
。
如需了解如何使用新功能,请参阅此版本中的 BasicManagedProfile
实现示例。
设备所有者
Android 5.0 引入了部署设备所有者应用的功能。设备所有者是一种专业的设备管理员,具有在设备上创建和移除次要用户以及配置全局设置的额外功能。您的设备所有者应用可以使用 DevicePolicyManager
类中的方法对受管设备上的配置、安全性和应用进行精细控制。一台设备在同一时间只能有一名活动的设备所有者。
如需部署和激活设备所有者,您必须在设备处于未配置状态时执行从编程应用到设备的 NFC 数据传输。此数据传输发送的信息与托管配置中描述的配置 intent 中发送的信息相同。
固定屏幕
Android 5.0 引入了一个新的固定屏幕 API,可让您暂时限制用户离开您的任务或被通知打断。举例来说,如果您要开发一款教育应用来支持 Android 上的高风险评估要求,或者您要开发单一用途或信息亭应用,便可使用此 API。您的应用激活固定屏幕后,在其退出该模式之前,用户将无法查看通知、访问其他应用或返回主屏幕。
激活固定屏幕的方式有两种:
- 手动:用户可以在设置 > 安全性 > 屏幕固定中启用固定屏幕功能,然后通过触摸“最近使用的应用”屏幕中的绿色图钉图标来选择要固定的任务。
- 以编程方式:如需以编程方式激活固定屏幕,请从应用中调用
startLockTask()
。如果发出请求的应用不是设备所有者,系统会提示用户进行确认。设备所有者应用可以调用setLockTaskPackages()
方法,在不执行用户确认步骤的情况下让应用可固定。
激活任务锁定时,会发生以下行为:
- 状态栏空白,并隐藏用户通知和状态信息。
- “主屏幕”按钮和“最近用过的应用”按钮处于隐藏状态。
- 其他应用无法启动新 Activity
- 当前应用可以启动新 activity,前提是这样做不会创建新任务。
- 当设备所有者调用固定屏幕时,用户将一直锁定于您的应用,直到应用调用
stopLockTask()
为止。 - 如果固定屏幕是由并非设备所有者的其他应用激活,或是由用户直接激活的,则用户可以通过同时按住“返回”和“最近用过”按钮退出固定屏幕。
打印框架
将 PDF 渲染成位图
您现在可以利用新增的 PdfRenderer
类,将 PDF 文档页面渲染成位图图像后进行打印。您必须指定一个可查找(即内容可随机访问的)ParcelFileDescriptor
,系统会在其上写入可打印内容。您的应用可以使用 openPage()
获取要渲染的页面,然后调用 render()
将打开的 PdfRenderer.Page
转换为位图。如果您只想将文档的一部分转换为位图图像(例如,为了实现平铺渲染以放大文档),还可以设置其他参数。
如需查看新 API 使用方法的示例,请参阅 PdfRendererBasic
示例。
系统
应用使用情况统计信息
现在,您可以利用新增的 android.app.usage
API 访问 Android 设备上的应用使用历史记录。与已废弃的 getRecentTasks()
方法相比,此 API 提供更详细的使用情况信息。
如需使用此 API,您必须先在清单中声明 "android.permission.PACKAGE_USAGE_STATS"
权限。
用户还必须通过 Settings > Security > Apps 为该应用启用访问使用情况的权限。
系统以应用为单位收集使用数据,按天、周、月和年汇总数据。系统保留这些数据的最长时长如下:
- 每日数据:7 天
- 每周数据:4 周
- 每月数据:6 个月
- 每年数据:2 年
系统会为每个应用记录以下数据:
- 最后一次使用应用的时间
- 在该时间间隔(以天、周、月或年为单位)内应用位于前台的总时长
- 一天中当组件(由软件包和 activity 名称标识)转入前台或后台时记录的时间戳
- 设备配置发生变化(如设备屏幕方向因旋转而发生变化)时记录的时间戳
测试与无障碍功能
测试与辅助工具改进
Android 5.0 添加了以下测试和无障碍功能支持:
- 新增的
getWindowAnimationFrameStats()
和getWindowContentFrameStats()
方法可采集窗口动画和内容的帧统计信息。这些方法让您可以编写仪器测试,以评估应用渲染帧时的刷新频率是否足以提供流畅的用户体验。 - 新的
executeShellCommand()
方法可让您通过插桩测试执行 shell 命令。命令的执行方式与从已连接到设备的主机运行adb shell
类似,允许您使用dumpsys
、am
、content
和pm
等基于 shell 的工具。 - 使用无障碍功能 API 的无障碍服务和测试工具(例如
UiAutomator
)现在可以检索视力正常的用户可与之互动的屏幕上窗口属性的相关详细信息。如需检索AccessibilityWindowInfo
对象的列表,请调用新的getWindows()
方法。 - 借助新增的
AccessibilityNodeInfo.AccessibilityAction
类,您可以定义要在AccessibilityNodeInfo
上执行的标准或自定义操作。新的AccessibilityNodeInfo.AccessibilityAction
类取代了以前在AccessibilityNodeInfo
中找到的与操作相关的 API。 - Android 5.0 可对您应用内的文本语音转换合成进行更精细的控制。新增的
Voice
类允许您的应用使用关联了特定语言区域、质量和延时评级以及文本语音转换引擎专属参数的语音配置文件。
IME
更方便的输入语言切换
从 Android 5.0 开始,用户可以更轻松地在平台支持的所有输入法 (IME) 之间切换。执行指定的切换操作(通常是触摸软键盘上的地球图标)可在所有此类 IME 中循环切换。这种行为变更是通过 shouldOfferSwitchingToNextInputMethod()
方法实现的。
此外,框架现在会检查下一个 IME 是否具有切换机制(并进而检查该 IME 是否支持切换到其后的 IME)。具有切换机制的 IME 将不会循环切换到不具有该机制的 IME。此行为变更是由 switchToNextInputMethod()
方法实现的。
如需查看如何使用更新后的 IME 切换 API 的示例,请参阅此版本中更新后的软键盘实现示例。如需详细了解如何实现 IME 之间的切换,请参阅创建输入法。
清单声明
可声明的必备功能
现在支持在 <uses-feature>
元素中使用以下值,以便您确保只在提供应用所需功能的设备上安装您的应用。
FEATURE_AUDIO_OUTPUT
FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING
FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR
FEATURE_CAMERA_CAPABILITY_RAW
FEATURE_CAMERA_LEVEL_FULL
FEATURE_GAMEPAD
FEATURE_LIVE_TV
FEATURE_MANAGED_USERS
FEATURE_LEANBACK
FEATURE_OPENGLES_EXTENSION_PACK
FEATURE_SECURELY_REMOVES_USERS
FEATURE_SENSOR_AMBIENT_TEMPERATURE
FEATURE_SENSOR_HEART_RATE_ECG
FEATURE_SENSOR_RELATIVE_HUMIDITY
FEATURE_VERIFIED_BOOT
FEATURE_WEBVIEW
用户权限
<uses-permission>
元素现在支持以下权限,以声明您的应用访问特定 API 所需的权限。
BIND_DREAM_SERVICE
:以 API 级别 21 及更高级别为目标平台时,Daydream 服务需要此权限,以确保只有系统才能与其绑定。