Android 8.0(API 级别 26)引入了各种 为用户和开发者提供新功能。 本文重点介绍面向开发者的新变化。
请务必也查看 <ph type="x-smartling-placeholder"></ph> Android 8.0 行为变更:了解平台变更的方面 可能会影响您的应用
用户体验
画中画模式
Android 8.0 中的画中画。
Android 8.0(API 级别 26)允许 activity 在 画中画 (PIP) 模式。画中画是 一种特殊类型的多窗口模式 主要用于视频播放。画中画模式最初适用于 仅限 Android TV;Android 8.0 让该功能 。
当 activity 处于画中画模式时,它会处于暂停状态,但应
继续显示内容。因此,您应确保您的应用
不会在 onPause()
中暂停播放
处理程序。您应改为在 onStop()
中暂停视频,并在 onStart()
中继续播放。如需了解详情,请参阅
多窗口模式
Lifecycle。
要指定您的 Activity 可以使用画中画模式,请将
android:supportsPictureInPicture
设为 true。
(从 Android 8.0 开始,PIP 不要求
android:resizeableActivity
清单属性。
但是,您必须设置
将 android:resizeableActivity
设为 `true`(如果您的 activity 支持其他
多窗口模式)。
Android 8.0(API 级别 26)引入了一个新对象 PictureInPictureParams
,
您可以将其传递给 PIP 方法,以指定 activity 的行为方式
以及当它处于画中画模式时该对象指定属性(如
activity 的首选宽高比。
现有的 PIP 方法 添加 画中画现在可以 并不仅限于 Android TV。此外, Android 8.0 提供以下方法来支持 画中画模式:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: 将 activity 置于画中画模式。activity 的宽高比 其他配置设置均由 args 指定。如果任何字段 args 为空,系统会使用您上次设置的值 名为Activity.setPictureInPictureParams()
。指定的 activity 放置在屏幕的一角;其余的 屏幕会用其显示上一个 activity。 进入画中画模式的 activity 会进入暂停状态,但会保留 。如果用户点按 PIP Activity,系统会显示 用户与之互动的内容当 activity 处于打开状态时,没有任何触摸事件到达 activity 处于画中画状态
-
Activity.setPictureInPictureParams()
: 更新 activity 的画中画配置设置。如果 activity 处于 当前处于画中画模式,系统会更新设置;如果您 activity 的宽高比发生变化。如果 Activity 未处于画中画模式, 这些配置设置用于enterPictureInPictureMode()
方法。
通知
在 Android 8.0(API 级别 26)中,我们对通知进行了重新设计, 提供了一种更简单、更一致的方法来管理通知行为 和设置。这些更改包括:
- 通知渠道:Android 8.0 中引入了 可让您创建用户可自定义的渠道的通知渠道 为每个您想要显示的通知类型界面是指 作为通知类别添加到通知渠道。了解 实现通知渠道的方法,请参阅 管理 通知渠道。
- 通知圆点:Android 8.0 引入了对显示 或标记。通知圆点反映 显示用户尚未关闭或未处理的通知。 要了解如何使用通知圆点,请参阅 通知 徽章。
- 延后:用户可以暂停通知,这会使通知消失 然后再重新显示通知会重新显示,并显示 重要性级别与最初显示时相同。应用可以移除或更新 更新已延后的通知, 让它重新出现
- 通知超时:您可以在创建
使用
setTimeoutAfter()
。 您可以使用此方法指定通知持续时长 。如果需要,您可以在 已过指定的超时持续时间。 - 通知设置:您可以拨打
setSettingsText()
设置在创建指向应用 使用Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
intent。 系统可能会提供以下 extra,以便过滤 您的应用必须向用户显示的设置:EXTRA_CHANNEL_ID
、NOTIFICATION_TAG
和NOTIFICATION_ID
。 - 通知关闭:用户可以自行关闭通知,并且
应用可以通过编程方式将其移除。您可以决定
通过实施
onNotificationRemoved()
方法(从NotificationListenerService
类。 - 背景颜色:您可以设置和启用
通知。您仅应在通知中使用此功能:
对用户而言至关重要的持续性任务对于
例如,您可以为与
行车路线、通话或进行中的通话。您还可以将
添加所需的背景颜色
setColor()
。执行此操作 可让您使用setColorized()
为通知启用背景颜色。 - 消息样式:在 Android 8.0 中,使用
MessagingStyle
类显示屏 展开前即可看到更多内容。您应该使用MessagingStyle
类 与消息功能相关的通知您还可以使用addHistoricMessage()
方法通过添加 历史消息发送到消息相关通知。
![Android 8.0(API 级别 26)中的通知长按菜单。](https://developer.android.google.cn/static/images/about/versions/oreo/notification-long-press.png?authuser=0000&hl=hu)
用户可以长按应用启动器图标进行查看 通知。
自动填充框架
账号创建、登录和信用卡交易需要时间,并且容易出现 错误。用户很容易对需要这些类型的应用感到不满 重复性任务。
Android 8.0(API 级别 26)支持填写表单(例如登录) 和信用卡表单,可以更轻松地实现。 在用户选择加入后,现有应用和新应用均可使用自动填充框架 自动填充。
您可以采取一些措施来优化应用与该框架的协作方式。 如需更多信息 请参阅自动填充框架概览。
可下载字体
Android 8.0(API 级别 26)和 Android 支持库 26 允许您从 而不是将字体捆绑到 APK 中,或让 APK 下载字体。此功能可减小 APK 大小,增大应用空间 安装成功率,并让多个应用共用同一种字体。
如需详细了解如何下载字体,请参阅 可下载字体。
XML 中的字体
Android 8.0(API 级别 26)引入了一项新功能,即 XML 中的字体,
您可以将字体用作资源。这意味着,您无需将字体
作为资源。字体在 R
文件中编译,并且会自动
作为资源在系统中提供然后,您可以使用
一种新的资源类型 font
的帮助。
支持库 26 在设备上完全支持此功能 运行 API 版本 14 及更高版本。
如需详细了解如何将字体用作资源以及如何检索系统字体,请参阅 请参阅 XML 中的字体。
自动调整 TextView 的大小
Android 8.0(API 级别 26)可让您设置文字展开或 自动收缩。这意味着 更轻松地优化文字大小,使其适合不同屏幕,或者采用动态内容。 如需详细了解如何在 Android 8.0 中自动调整 TextView 的大小, 请参阅自动调整 TextView 的大小。
自适应图标
Android 8.0(API 级别 26)引入了自适应启动器图标。自适应图标支持视觉元素 并能在不同设备型号上显示各种形状要了解如何 制作自适应图标,请参阅自适应图标 指南。
颜色管理
成像应用的 Android 开发者现在可以充分利用新设备 具有支持广色域色彩的显示器显示广色域 映像,应用将需要在其清单中(按 activity)启用一个标志 并加载带有嵌入式广色域配置文件(AdobeRGB、 Pro Photo RGB、DCI-P3 等)。
WebView API
Android 8.0 提供了一些 API 来帮助您管理
在应用中显示 Web 内容的 WebView
对象。
这些 API 可提高应用的稳定性和安全性,包括
以下:
- Version API
- Google SafeBrowsing API
- Termination Handle API
- Renderer Importance API
如需详细了解如何使用这些 API,请参阅 管理 WebView。
WebView
类现在包含一个 Safe Browsing API 来增强安全性
网络浏览。如需了解详情,请参阅
Google Safe Browsing API。
固定快捷方式和微件
Android 8.0(API 级别 26)引入了快捷方式的应用内固定和 微件。在应用中,您可为 Android Studio 中的 支持的启动器。
有关详情,请参阅 固定快捷方式和微件 功能指南。
最大屏幕纵横比
Android 8.0(API 级别 26)更改了如何配置应用的最大宽高比。
首先,Android 8.0 引入了 maxAspectRatio 属性,也就是 可用于设置应用的最大宽高比。此外,在 Android 8.0 及更高版本中,应用的 默认的最大宽高比是运行应用的设备的原生宽高比。
如需详细了解如何声明最大宽高比,请参阅 支持多种屏幕。
多显示屏支持
从 Android 8.0(API 级别 26)开始,Android 平台提供增强的 支持多个显示屏如果 activity 支持多窗口模式,并且 在具有多个显示屏的设备上运行时,用户可以移动 activity 从不同显示屏获取内容当应用启动一个 activity 时, 可指定 activity 应在哪个显示屏上运行。
注意 :如果某个 activity 支持 多窗口模式,则 Android 8.0 会自动启用 因此该 activity 支持多显示屏。您应当对应用进行测试 确保它能在多显示屏环境中正常运行。
每次只有一个 activity 可以处于已恢复状态,即使 应用具有多个显示屏获得焦点的 activity 处于已恢复状态; 所有其他可见的 activity 都会暂停,但不会停止。更多信息 当多个 activity 可见时,在 activity 生命周期中 请参阅多窗口模式 Lifecycle。
当用户将 activity 从一个显示屏移到另一个显示屏时,系统会 调整 activity 大小,并根据需要发出运行时更改。您的活动记录 可以自行处理配置变更 销毁包含 activity 的进程,然后使用新的 activity 重新创建该 activity 维度。如需了解详情,请参阅 处理配置 更改。
ActivityOptions
提供了两种新方法来支持
多个显示屏:
setLaunchDisplayId()
- 指定 activity 启动时应显示在哪个显示屏上。
getLaunchDisplayId()
- 返回 activity 的当前启动显示屏。
adb shell 进行了扩展,以支持多个显示屏。
shell start
命令现在可用于启动 activity,
并指定 activity 的目标显示屏:
adb shell start <activity_name> --display <display_id>
统一的布局外边距和内边距
Android 8.0(API 级别 26)可让您更轻松地指定对面
View
元素的外边距或内边距相同。
具体而言,您现在可以在布局 XML 中使用以下属性
文件:
- <ph type="x-smartling-placeholder"></ph>
layout_marginVertical
,用于定义layout_marginTop
和layout_marginBottom
。 - <ph type="x-smartling-placeholder"></ph>
layout_marginHorizontal
,用于定义layout_marginLeft
和layout_marginRight
。 - <ph type="x-smartling-placeholder"></ph>
paddingVertical
,用于定义paddingTop
和paddingBottom
。 - <ph type="x-smartling-placeholder"></ph>
paddingHorizontal
,用于定义paddingLeft
和paddingRight
。
注意:如果您将应用的逻辑自定义为
支持不同的
(包括文本方向),请注意,这些
属性不会影响
layout_marginStart
、
layout_marginEnd
,
paddingStart
或
敬上
paddingEnd
。您可以自行设置这些值
新的垂直和水平布局属性,用于创建布局行为
具体取决于文本方向。
指针捕获
有些应用(如游戏、远程桌面和虚拟化客户端)对 获得对鼠标指针的控制所带来的好处。指针捕获是一项新功能 Android 8.0(API 级别 26)中的功能,通过传递所有鼠标事件来提供此类控制 传递到应用中的聚焦视图
从 Android 8.0 开始,应用中的 View
可以请求
指针捕获并定义一个监听器来处理捕获的指针事件。通过
在该模式下,鼠标指针会隐藏起来。该视图可以释放指针捕获
不再需要鼠标信息时。系统还可以
视图失去焦点时(例如当用户打开它时)捕获指针
另一个应用。
如需了解如何在应用中使用此功能,请参阅 指针捕获。
应用类别
Android 8.0(API 级别 26)允许每个应用声明其所属的类别
。这些类别用于将具有相似特征的应用汇集到一起,
用途或功能,例如数据使用、电池使用或
存储空间用量。您可以通过设置
<application>
中的 android:appCategory
属性
清单标记。
Android TV 启动器
Android 8.0(API 级别 26)包含一项以内容为中心的新功能, Android TV 主屏幕体验:可通过 适用于 Android 8.0 的 Android TV 模拟器和 Nexus Player 设备映像。新版主屏幕整理得井井有条 频道对应各行中的视频内容,每个频道 系统。应用可以发布多个渠道,并且用户可以配置其 主屏幕上显示的内容Android TV 主屏幕还包含一个“接下来观看”行,该行 。应用还可以提供 视频预览,即在用户聚焦于某个节目时自动播放。用于 填充的频道和节目是 TvProvider API 的一部分,这些 API 以 Android Android 8.0 中的支持库模块。
AnimatorSet
从 Android 8.0(API 级别 26)开始,AnimatorSet
API 现在支持寻道和播放
反向排序。跳转功能可让您将动画位置设为
。如果您的应用包含动画,反向播放非常有用
执行可以撤消的操作无需定义两个单独的动画
您可以反向播放相同的这一段
输入和导航
键盘导航键区
如果应用中的 activity 使用复杂的视图层次结构,例如 图 2,考虑将界面元素组整理为聚类,以简化操作 通过键盘进行导航。用户可按 Meta+Tab 或搜索键 + Tab Chromebook 设备,以从一个集群导航到另一个集群。好的 元素集包括:侧边栏、导航栏、主要内容区域和元素 并可能包含多个子元素
![一个包含 5 个用户导航键的 Activity 示例
可以使用键盘导航键区快捷键进行导航集群
按以下排列方式显示:顶部面板、左侧面板、主要内容
区域、底部面板和悬浮操作按钮。](https://developer.android.google.cn/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=0000&hl=hu)
创建 View
或 ViewGroup
元素
集群,设置
<ph type="x-smartling-placeholder"></ph>
android:keyboardNavigationCluster
属性设为
在元素的布局 XML 文件中使用 true
,或传递 true
到应用界面逻辑中的 setKeyboardNavigationCluster()
中。
注意:虽然集群是非嵌套的,但其无法嵌套
集群可能出现在层次结构的不同级别。如果您尝试
嵌套集群,框架只会处理最顶层
ViewGroup
元素作为聚类。
在有触摸屏的设备上,你可以将仪表板指定的
ViewGroup
对象的
将 android:touchscreenBlocksFocus
元素更改为 true
至
仅允许从集群进出该集群。如果您应用此方法
配置,则用户无法使用 Tab 键或箭头键
进入或离开集群他们必须按仪表板导航
组合键。
视图默认焦点
在 Android 8.0(API 级别 26)中,您可以分配 View
会在(重新)创建的 Activity 恢复且用户按下
键盘导航键,例如 Tab 键。为了应用此“默认情况下聚焦”
设置,将 View
元素的
<ph type="x-smartling-placeholder"></ph>
android:focusedByDefault
属性设为 true
包含界面元素的布局 XML 文件,或者将 true
传递给
setFocusedByDefault()
应用的界面逻辑
语音输出
activity 和服务可以使用
TextToSpeech
用于语音输入和发音。截至
Android 8.0(API 级别 26),您的应用可以获取更精确的时间信息
文字转语音引擎何时开始读出单个合成字词,
只要引擎提供这些信息即可。您可以使用此功能
在文字转语音引擎进行朗读时,吸引您对特定字词的关注
。
要在您的应用中使用这些文字转语音引擎改进,请注册
UtteranceProgressListener
的实例。作为
注册过程中,请添加
onRangeStart()
方法。
文字转语音引擎调用
rangeStart()
即可录制
预期播放特定范围文本的时间点
。当该文本范围的音频开始播放时,应用的
onRangeStart()
方法执行。然后,您的应用可以响应此回调,例如,通过
突出显示与话语关联的文本范围。
详细了解如何跟踪文字转语音的播放进度
引擎,请参阅 UtteranceProgressListener
类
参考。
系统
新的 StrictMode 检测程序
Android 8.0(API 级别 26)添加了三个新的 StrictMode 检测器, 应用中可能存在的 bug:
detectUnbufferedIo()
将检测 您的应用会在不缓冲的情况下读写数据,这可能会极大影响 性能detectContentUriWithoutPermission()
将会 检测到您的应用何时意外忘记向其他应用授予权限 在应用外启动 activity。detectUntaggedSockets()
将检测 您的应用无需使用setThreadStatsTag(int)
,用于标记流量以进行调试 目的。
缓存的数据
Android 8.0(API 级别 26)针对缓存数据提供了更好的指导和行为。每个
现在,系统会为应用提供用于缓存数据的磁盘空间配额,该配额由
getCacheQuotaBytes(UUID)
。
当系统需要释放磁盘空间时,会先从应用中删除缓存文件 超出其所分配的配额的那些客户。因此,如果您将缓存数据保留在 分配配额时,在上传资源时,您的缓存文件将是系统中最后要清除的文件之一 。当系统决定要删除您应用中的哪些缓存文件时,它会 优先考虑最早的文件(由修改时间确定)。
您还可以为每个目录启用两种新行为,以控制 系统如何释放缓存数据:
StorageManager.setCacheBehaviorAtomic()
可用于指示 指定目录及其所有内容应作为一个原子单元进行删除。setCacheBehaviorTombstone(File, boolean)
可用于指示 应将其截断为 0 个字节,而不是删除目录中的 保留空文件不变。
最后,当需要为大型文件分配磁盘空间时,可以考虑使用新版
allocateBytes(FileDescriptor, long)
API,这会自动清除
属于其他应用的缓存文件(如果需要),以满足您的请求。在确定
设备有足够的磁盘空间来保存新数据,
getAllocatableBytes(UUID)
,而不使用
getUsableSpace()
,因为前者将将所有缓存内容视为
系统愿意代您清除的数据。
内容提供程序分页
我们更新了 content provider,以支持加载大型 数据集。例如,一款照片应用 可以查询要在网页中显示的数据的子集。每个页面 的内容提供程序返回的结果由单个游标表示 对象。客户端和提供程序都必须实现分页才能利用 。
如需详细了解内容提供程序的变更,请参阅
ContentProvider
和
ContentProviderClient
。
内容刷新请求
ContentProvider
和
ContentResolver
类现在每个都包含一个
refresh()
方法,以便客户端更轻松地了解
请求的信息都是最新的。
您可以通过扩展
ContentProvider
。请务必覆盖
要返回的 refresh()
方法
true
,向您提供商的客户表明您已尝试
自行刷新数据
您的客户端应用可以通过调用
方法,也称为
refresh()
。调用该方法时,
方法,传入要刷新的数据的 URI。
注意:由于您可能会通过网络请求数据,
您应从调用 refresh()
有明显迹象表明内容已经过时。
执行此类内容刷新的最常见原因是
滑动刷新
手势,明确请求当前界面显示最新内容。
JobScheduler 改进
Android 8.0(API 级别 26)引入了对 JobScheduler
的多项改进。这些改进可让您的应用更轻松地
以遵守新的背景
执行限制,因为您通常可以使用计划作业来替换
当前受限的后台服务或隐式广播接收器。
JobScheduler
的更新包括:
-
您现在可以将工作队列与预定作业相关联。将工作项添加到
调用
JobScheduler.enqueue()
。 当作业运行时,它可以将待处理工作从队列中移出并进行处理。 这项功能可处理很多以前需要 调用后台服务,特别是实现IntentService
。 -
Android 设备
Support Library 26.0.0 引入了一个新的
JobIntentService
类,该类提供相同的 功能作为IntentService
使用,但使用的是作业,而不是 (在 Android 8.0(API 级别 26)或更高版本上运行时)。 -
您现在可以拨打
JobInfo.Builder.setClipData()
将ClipData
与作业相关联。通过此选项,您可以 将 URI 权限授予与作业关联,类似于 权限可以传播到Context.startService()
。您还可以将 URI 权限授予与 intent 搭配使用 工作队列。 -
计划的作业现在支持多个新限制条件:
<ph type="x-smartling-placeholder">
- </ph>
JobInfo.isRequireStorageNotLow()
- 如果设备的可用存储空间不足,作业不会运行。
JobInfo.isRequireBatteryNotLow()
- 如果电池电量等于或低于临界水平,作业不会运行 阈值;当电池电量不足时,设备会显示“电量不足”。 警告系统对话框。
NETWORK_TYPE_METERED
- 工作需要按流量计费的网络连接,例如大多数移动数据网络 方案。
自定义数据存储
Android 8.0(API 级别 26)支持您根据自己的偏好设置提供自定义的数据存储区, 如果您的应用将偏好设置存储在云端或本地数据库中,则相应选项会非常有用;或者 。如需详细了解 实现数据存储区,请参阅 自定义数据存储区。
媒体增强功能
VolumeShaper
有一个新的 VolumeShaper
类。使用
用于执行简短的自动音量转换,例如淡入、淡出和淡入淡出。
请参阅使用 VolumeShaper 控制振幅
了解详情。
音频焦点增强功能
音频应用通过请求和放弃音频焦点来共享设备上的音频输出。
应用通过开始或停止播放或降低音量来处理焦点变化。
有一个新的 AudioFocusRequest
类。使用此类作为
requestAudioFocus()
,
应用在处理音频焦点变化时具有新功能:
自动降低其他应用音量和
延迟获取焦点。
媒体指标
新的 getMetrics()
方法会返回 PersistableBundle
包含配置的对象
和性能信息,表示为属性和值的对应关系。
我们为这些媒体类定义了 getMetrics()
方法:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
系统会为每个实例分别收集相关指标,并在实例的整个生命周期内保留这些指标。如果没有任何可用指标,则该方法会返回 null。返回的实际指标取决于类。
MediaPlayer
从 Android 8.0(API 级别 26)开始,MediaPlayer 可以播放内容 受 DRM 保护 Material 和 HLS 样本级加密媒体。
Android 8.0 引入了一项新的过载
seekTo()
命令,
进行控制它包含用于指定跳转模式的第二个参数:
SEEK_PREVIOUS_SYNC
将媒体位置移至同步帧(或关键帧) 与位于指定时间之前或指定时间的数据源相关联。SEEK_NEXT_SYNC
将媒体位置移至关联的同步(或关键帧)帧 且数据源位于指定时间之后或指定的时间。SEEK_CLOSEST_SYNC
将媒体位置移至同步帧(或关键帧) 与位于指定时间或距离最近的数据源相关联。SEEK_CLOSEST
将媒体位置移至帧(不一定是同步操作) 或关键帧) 指定的时间
连续跳转时,应用应使用任意 SEEK_
模式,而不是 SEEK_CLOSEST
,后者运行速度相对较慢,但可能更精确。
MediaRecorder
- MediaRecorder 现在支持 MPEG2_TS 格式,
在线播放:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
MediaMuxer
现在可以处理任意数量的音频和视频流。你已解除受限状态 一个音轨和/或一个视频轨道。使用addTrack()
您可以混录任意数量的曲目。MediaMuxer
还可以添加一个或多个包含用户定义的每帧的元数据轨道 信息。元数据的格式由您的应用定义。通过 只有 MP4 容器支持元数据轨道。
元数据对于离线处理非常有用。例如,来自 传感器可用于执行视频防抖。
添加元数据轨道时,轨道的 MIME 格式必须以前缀开头
"application/"。写入元数据的方式与写入视频/音频数据相同,但以下情况除外:
数据并非来自 MediaCodec
。相反,应用会将
将 ByteBuffer
替换为
writeSampleData()
方法。
时间戳必须与视频和音频轨道的时基相同。
生成的 MP4 文件使用此部分中定义的 TextMetaDataSampleEntry
ISOBMFF 的 12.3.3.2 来表示元数据的 MIME 格式。使用 MediaExtractor
提取包含元数据轨道的文件时,MIME 是
格式的元数据会提取到MediaFormat
中。
增强的媒体文件访问功能
通过
<ph type="x-smartling-placeholder"></ph>
借助存储访问框架 (SAF),应用可以公开自定义的
DocumentsProvider
,它可提供对文件的访问权限
连接到其他应用事实上,
文档提供程序甚至可以提供
或使用诸如
媒体传输协议 (MTP):
但是,从远程数据源访问大型媒体文件 挑战:
- 媒体播放器需要以寻址方式访问来自文档提供程序的文件。 如果大型媒体文件位于远程数据源上, 文档提供程序必须提前提取所有数据并创建快照 文件描述符。没有文件,媒体播放器无法播放文件 描述符,因此在文档提供程序完成之前,无法开始播放 下载该文件。
- 媒体集合管理器(例如照片应用)必须遍历一系列 通过作用域访问 URI,以访问存储在外部 SD 卡上的媒体 文件夹中。这种访问模式可对媒体执行批量操作,例如 移动、复制和删除,速度都很慢。
- 媒体集合管理器无法确定文档的位置,因为它 URI这使得这类应用的用户难以选择 媒体文件的保存位置
Android 8.0 通过改进存储访问能力来应对上述挑战 框架。
自定义文档提供程序
从 Android 8.0 开始,存储访问框架允许 自定义文档 provider 为本地存储器中的文件创建可寻址的文件描述符, 远程数据源。SAF 可以打开文件,以获取原生可查找文件 描述符。然后,SAF 向文档传递离散字节请求。 提供商。通过此功能,文档提供程序可以返回 而不是缓存整个 文件。
要使用此功能,您需要调用新的
StorageManager.openProxyFileDescriptor()
方法结合使用。通过
openProxyFileDescriptor()
方法接受 ProxyFileDescriptorCallback
对象作为回调。SAF 调用
回调
从文档提供程序返回的文件描述符。
直接文档访问
从 Android 8.0(API 级别 26)开始,您可以使用
getDocumentUri()
方法
获取引用了与给定 mediaUri
相同的文档的 URI。
不过,由于返回的 URI 由
DocumentsProvider
,媒体集合管理员可以访问
而无需遍历分区目录树。
因此,媒体管理器可以对文档执行文件操作,
速度明显更快。
注意:getDocumentUri()
方法仅定位媒体文件;它不向应用授予
访问这些文件的权限。详细了解如何获取访问权限
媒体文件的权限,请参阅参考文档。
文档路径
在 Android 8.0(API 级别 26)中使用存储访问框架时,您可以使用
findDocumentPath()
方法,在
DocumentsContract
和
DocumentsProvider
类,在给定文档的
ID。该方法会在
DocumentsContract.Path
对象。如果文件
系统对同一文档有多个已定义的路径,该方法会返回
访问具有指定 ID 的文档时最常用的路径。
此功能尤其适用于以下情况:
- 您的应用使用了“另存为”对话框显示了 特定文档。
- 您的应用在搜索结果视图中显示文件夹,并且必须加载子级 包含位于特定文件夹中的文档 文件夹中。
注意:如果您的应用仅有权访问部分文档
则 findDocumentPath()
的返回值仅包含
您的应用可以访问的文件夹和文档。
监控音频播放
AudioManager
系统服务会维护
活跃的 AudioPlaybackConfiguration
对象,每个
包含有关特定音频播放会话的信息。您的应用可以
通过调用
getActivePlaybackConfigurations()
。
从 Android 8.0(API 级别 26)开始,您可以注册一个回调,
一个或多个
AudioPlaybackConfiguration
个对象已更改。为此,
调用 registerAudioPlaybackCallback()
,并传入
AudioManager.AudioPlaybackCallback
。通过
AudioManager.AudioPlaybackCallback
类包含
onPlaybackConfigChanged()
方法,系统会在音频播放时调用该方法
播放配置更改。
连接
Wi-Fi 感知
Android 8.0(API 级别 26)添加了对 Wi-Fi 感知(基于 Neighbor)的支持 感知网络 (NAN) 规范。在安装了适当 WLAN 感知硬件、应用和附近的设备可以发现和通信 在没有互联网接入点的情况下通过 Wi-Fi 传输。我们现在处理的是硬件 合作伙伴尽快将 Wi-Fi 感知技术引入设备。对于 如需了解如何将 Wi-Fi 感知集成到您的应用中,请参阅 Wi-Fi 感知。
蓝牙
Android 8.0(API 级别 26)通过添加以下 功能:
- 支持 AVRCP 1.4 标准,该标准支持歌曲库浏览。
- 支持蓝牙低功耗 (BLE) 5.0 标准。
- 将 Sony LDAC 编解码器集成到蓝牙堆叠中。
配套设备配对
Android 8.0(API 级别 26)提供的 API 可让您自定义 尝试与配套设备配对时出现的配对请求对话框 蓝牙、BLE 和 Wi-Fi。如需了解详情,请参阅 配套设备 配对。
有关在 Android 上使用蓝牙的更多信息,请参阅 蓝牙指南。对于 特定于 Android 8.0(API 级别 26)的蓝牙变更,请参阅 蓝牙部分 Android 8.0 行为变更页面。
分享
智能共享
Android 8.0(API 级别 26)会了解用户的个性化分享 并更好地了解 分享应用。例如,如果用户拍摄了收据照片,Android 8.0 可以推荐费用跟踪应用;如果用户自拍,社交媒体就会触发 应用能够更好地处理图片。Android 8.0 会自动学习所有这些 根据用户的输入个性化偏好设置
智能分享功能适用于 image
之外的内容类型,例如
audio
、video
、text
、URL
、
等等
要启用智能分享功能,请添加 ArrayList
(最多三个)
字符串注释添加到分享内容的 intent。注释应
描述内容中的主要组成部分或主题。以下代码示例
展示了如何向 intent 添加注释:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
如需详细了解智能分享注释,请参阅
EXTRA_CONTENT_ANNOTATIONS
。
文本分类器
在兼容的设备上,应用可以使用新的文本分类器检查
字符串与某个已知的分类器实体类型匹配,并获取建议的选择
替代选项。系统识别的实体包括地址、网址、
电话号码和电子邮件地址如需了解详情,请参阅
TextClassifier
。
无障碍
Android 8.0(API 级别 26)支持 开发者:
- 新增了用于调整的音量类别 无障碍设施 数据量。
- 指纹 手势作为输入机制。
- 多语言 文字转语音功能。
- 基于硬件的 无障碍设施 快捷方式,以便快速访问首选无障碍服务。
- 支持 (续) 手势,即由编程方式进行的笔触序列。
- 一个 无障碍设施 按钮,用于调用若干已启用的无障碍功能之一 (仅适用于使用软件渲染的导航区域的设备)。
- 标准化 单侧范围值。
- 一些适用于 文字,包括提示文字和屏幕上文字的位置 字符。
安全和隐私保护
权限
Android 8.0(API 级别 26)引入了多个与电话相关的新权限:
-
ANSWER_PHONE_CALLS
权限允许您的应用回答问题 以编程方式进行来电。如要在以下位置处理来电: 使用acceptRingingCall()
方法。 -
READ_PHONE_NUMBERS
权限可向您的应用授予以下读取权限: 存储在设备中的电话号码。
新的账号访问和 Discovery API
Android 8.0(API 级别 26)引入了多项改进, 应用可以访问用户账号。对于他们管理的账号 身份验证器可以使用自己的政策来决定是否对 或向应用显示账号。Android 系统会跟踪 访问特定的账号。
在以前的 Android 版本中,想要跟踪
用户账号必须获取有关所有账号的最新动态,包括符合以下条件的账号:
不相关的类型。Android 8.0 新增了
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
方法,可让应用指定账号类型列表
接收哪些账号更改
API 变更
AccountManager 提供六个新方法来帮助身份验证器管理 以下应用可以查看某个账号:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: 设置特定用户账号和软件包的可见性级别 组合-
getAccountVisibility(android.accounts.Account, java.lang.String)
: 获取特定用户账号和软件包的可见性级别 组合 -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: 允许身份验证器获取账号及其公开范围级别 指定的软件包。 -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: 允许身份验证器获取为给定账号存储的可见性值。 -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: 允许身份验证器初始化账号的可见性值。 -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: 将OnAccountsUpdateListener
监听器添加到AccountManager
对象。系统会调用此监听器 每当设备上的账号列表发生变化时。
Android 8.0(API 级别 26)引入了两个特殊的软件包名称值来指定可见性
未使用
setAccountVisibility(android.accounts.Account, java.lang.String, int)
方法。通过
PACKAGE_NAME_KEY_LEGACY_VISIBLE
可见性值会应用于
GET_ACCOUNTS
权限以及
Android 版本低于 Android 8.0,或
签名与针对任何 Android 版本的身份验证器匹配。
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
提供默认的可见性值
之前未设置的应用
“PACKAGE_NAME_KEY_LEGACY_VISIBLE
”不是
。
如需详细了解新的账号访问权限和 Discovery API,请参阅
参考信息
AccountManager
和
OnAccountsUpdateListener
。
测试
仪器测试
Android 8.0(API 级别 26)针对应用的 插桩测试。
针对非默认应用进程运行
现在,您可以指定应针对哪些特定插桩测试运行 应用的默认进程之外的进程如果遇到以下情况,此配置非常有用: 您的应用包含在不同进程中运行的多个 activity。
如需定义非默认进程插桩,请前往您的清单
文件,然后在该文件中
<ph type="x-smartling-placeholder"></ph>
<instrumentation>
元素。将
android:targetProcess
属性,并将其值设置为以下值之一:
以下:
- 特定进程的名称。
- 以逗号分隔的进程名称列表。
- 通配符 (
"*"
),允许运行插桩 针对执行指定软件包中的代码的任何已启动进程,android:targetPackage
属性。
在执行插桩测试时,您可以查看哪个进程
它正通过调用 getProcessName()
进行测试。
在测试过程中报告结果
现在,你可以在执行插桩测试时报告结果,
而不是之后调用 addResults()
。
用于测试的模拟 Intent
为了更轻松地为应用的
Android 8.0(API 级别 26)引入了
onStartActivity()
方法结合使用。您可以在
Instrumentation.ActivityMonitor
类用于处理特定的
intent。
当您的测试类调用 intent 时,该方法会返回一个桩
Instrumentation.ActivityResult
对象,而不是执行
intent 本身。通过在测试中使用此模拟 intent 逻辑,您可以
activity 如何准备和处理传递给
或转到完全不同的应用
运行时和工具
平台优化
Android 8.0(API 级别 26)为平台带来了运行时优化和其他优化, 大幅提升性能 这些优化包括并发压缩垃圾回收、 更高效地利用内存和代码位置。
这些优化可以缩短启动时间, 操作系统和应用。
更新了 Java 语言支持
Android 8.0(API 级别 26)添加了对几个其他 OpenJDK Java API 的支持:
- OpenJDK 8 中的
java.time
。 - OpenJDK 7 中的
java.nio.file
和java.lang.invoke
。
如需详细了解这些新添加的类和方法, 请参阅 API 参考文档。
如果您希望 使用 Java 8 语言功能时,您应该 下载最新的预览版。
更新的 ICU4J Android Framework API
Android 8.0(API 级别 26)扩展了
ICU4J Android 框架
API(ICU4J API 的一部分),供应用开发者
在 android.icu
软件包下使用。这些 API 使用本地化数据
因此,您无需编译
APK 中的 ICU4J 库。
表 1. 使用的 ICU、CLDR 和 Unicode 版本 。
Android API 级别 | ICU 版本 | CLDR 版本 | Unicode 版本 |
---|---|---|---|
Android 7.0(API 级别 24),Android 7.1(API 级别 25) | 56 | 28 | 8.0 |
Android 8.0(API 级别 26) | 58.2 | 30.0.3 | 9.0 |
如需详细了解 Android 国际化,包括 ICU4J 支持,请参阅 Android 国际化。
Android 企业版
我们针对运行 Android 8.0(API 级别 26)。其中亮点包括:
- 完全受管设备上的工作资料可让企业将工作与 个人数据,同时管理这两者。
- API 委派允许设备所有者和资料所有者分配应用 对其他应用的管理
- 配置流程中的用户体验改进(包括新的 自定义选项)可缩短设置时间。
- 针对蓝牙、Wi-Fi、备份和安全性的全新控制功能让企业 管理设备的更多功能网络活动日志记录可帮助企业跟踪 问题。
如需详细了解上述及其他新的 Android Enterprise API 和功能, 请参阅企业中的 Android。