### **[Android 8.1功能和API](https://developer.android.com/about/versions/oreo/android-8.1.html)**
Android 8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。
#### **Android奥利奥(Go版)**
Android Go是我们主动为全球数十亿在线用户优化Android体验。从Android 8.1开始,我们将使Android成为入门级设备的绝佳平台。Android Oreo(Go版)配置中的功能包括:
* 内存优化。改善整个平台的内存使用情况,确保应用程序可以在1GB或更少RAM的设备上高效运行。
* 灵活的定位选项。新的 硬件功能常量,可让您通过Google Play将应用程序分配到普通或低RAM设备。
* Google Play。虽然所有的应用程序都可以在运行Android Oreo(Go版)的设备上使用,但Google Play将提供开发人员专门优化的应用程序的可见性,为数十亿用户提供数十亿 指导方针的良好体验 。
我们已经更新了数十亿 指南的建设, 并提供了关于如何 针对运行Android Oreo(Go版)的设备优化您的应用的其他指导 。对于大多数开发者来说,优化现有的APK或使用Google Play的 多APK功能将您的APK版本定位到低内存设备是准备运行Android Oreo(Go版)的设备的最佳方式。请记住,无论使用哪种设备,让您的应用 更轻盈,更高效,都可以让您的整个观众受益
#### **神经网络API**
Neural Networks API为设备上的机器学习框架(如TensorFlow Lite -Google的移动平台ML库以及Caffe2等)提供了加速的计算和推理。访问TensorFlow Lite 开源回购下载和文档。TensorFlow Lite可与Neural Networks API 协同工作,在移动设备上高效运行 MobileNets, Inception v3和 Smart Reply等模型。
#### **自动填充框架更新**
Android 8.1(API级别27)对自动填充框架进行了一些改进,您可以将其添加到应用程序中。
该BaseAdapter 级现在包括setAutofillOptions() 方法,它允许您提供值的字符串表示在一个适配器。这对于 在其适配器中动态生成值的微调控件非常有用。例如,您可以使用该setAutofillOptions()方法提供用户可以选择作为信用卡过期日期一部分的年份列表的字符串表示形式。自动填充服务可以使用字符串表示来适当填写需要数据的视图。
此外,AutofillManager 该类还包括notifyViewVisibilityChanged(View, int, boolean)可以调用的方法,以通知框架关于虚拟结构中视图可见性的更改。非虚拟结构的方法也有重载。但是,非虚拟结构通常不要求您明确地通知框架,因为该方法已被View 该类调用 。
Android 8.1还为Autofill服务提供了更多的能力,通过添加对CustomDescription and Validator 内部的支持来定制保存UI可供性SaveInfo。
自定义描述可帮助自动填充服务澄清正在保存的内容; 例如,当屏幕包含信用卡时,它可以显示信用卡银行的标志,信用卡号码的最后四位数字和到期号码。要了解更多信息,请参阅 CustomDescription 课程。
Validator 对象用于避免在验证条件不满足时显示自动填充保存UI。要了解更多信息,请参阅 Validator类及其子类 LuhnChecksumValidator和RegexValidator。
#### **通知**
Android 8.1包含对通知的以下更改:
* 应用程序现在只能每秒发出一次通知警报声音。超过这个速度的警报声音不会排队并丢失。此更改不会影响通知行为的其他方面,通知邮件仍按预期发布。
* NotificationListenerService并且 在 被称为ConditionProviderService返回的低内存Android设备上不受支持。 trueActivityManager.isLowRamDevice()
#### **EditText更新**
从API级别27开始,该EditText.getText()方法返回一个Editable; 以前它返回一个CharSequence。这种变化是向后兼容的,作为Editable实现 CharSequence。
该Editable接口提供了宝贵的附加功能。例如,因为Editable也实现了Spannable接口,所以可以将标记应用于实例中的内容EditText。
#### **程序化安全浏览操作**
通过使用安全浏览API 的实施,您的应用可以检测何时尝试导航到Google已经归类为已知威胁的URL 的实例。默认情况下,会 显示警告用户已知威胁的插页式广告。该屏幕允许用户选择加载URL,或返回到安全的上一页。 WebViewWebViewWebView
在Android 8.1中,您可以通过编程来定义您的应用程序如何响应已知的威胁:
* 您可以控制您的应用是否将已知威胁报告给安全浏览。
* 您可以让自己的应用程序自动执行特定操作(例如回到安全状态),每次遇到安全浏览会将其归类为已知威胁的网址时。
> 注意:为了最大限度地防范已知威胁,请等到您在调用WebView对象的loadUrl()方法之前初始化安全浏览 。
以下代码片段显示了如何指示您的应用程序的实例 WebView在遇到已知威胁后总是返回到安全状态:
AndroidManifest.xml中
~~~
<manifest>
<application>
...
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
</application>
</manifest>
~~~
**MyWebActivity.java**
~~~
private WebView mSuperSafeWebView;
private boolean mSafeBrowsingIsInitialized;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSuperSafeWebView = new WebView(this);
mSuperSafeWebView.setWebViewClient(new MyWebViewClient());
mSafeBrowsingIsInitialized = false;
mSuperSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {
@Override
public void onReceiveValue(Boolean success) {
mSafeBrowsingIsInitialized = true;
if (!success) {
Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");
}
}
});
}
~~~
**MyWebViewClient.java**
~~~
public class MyWebViewClient extends WebViewClient {
// Automatically go "back to safety" when attempting to load a website that
// Safe Browsing has identified as a known threat. An instance of WebView
// calls this method only after Safe Browsing is initialized, so there's no
// conditional logic needed here.
@Override
public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
int threatType, SafeBrowsingResponse callback) {
// The "true" argument indicates that your app reports incidents like
// this one to Safe Browsing.
callback.backToSafety(true);
Toast.makeText(view.getContext(), "Unsafe web page blocked.",
Toast.LENGTH_LONG).show();
}
}
~~~
#### **视频缩略图提取器**
的MediaMetadataRetriever类有一个新的方法,getScaledFrameAtTime()即找到邻近给定的时间位置的帧,并返回具有相同的纵横比作为源帧的位图,但是缩放,以符合给定宽度和高度的矩形。这对于从视频生成缩略图图像很有用。
我们建议使用这种方法,而不是getFrameAtTime()浪费内存,因为它返回一个与源视频分辨率相同的位图。例如,来自4K视频的帧将是16MB的位图,远大于缩略图所需的位图。
#### **共享内存API**
Android 8.1(API等级27)引入了一个新的 SharedMemory API。这个类允许你创建,映射和管理一个匿名 SharedMemory 实例。您可以将SharedMemory 对象的内存保护设置 为读取和/或写入,并且由于 SharedMemory 对象是Parcelable,因此可以通过AIDL轻松地将其传递给另一个进程。
该SharedMemory API与互操作 ASharedMemory的NDK设施。 ASharedMemory允许访问文件描述符,然后可以将其映射到读取和写入。这是在应用程序之间或单个应用程序中的多个进程之间共享大量数据的好方法。
#### **WallpaperColors API**
Android 8.1(API等级27)允许您的动态壁纸为系统UI提供颜色信息。您可以通过WallpaperColors 从位图,可绘制对象或使用三种手动选择的颜色创建对象来实现此目的。你也可以检索这个颜色信息。
要创建一个WallpaperColors 对象,请执行以下任一操作:
* 要WallpaperColors 使用三种颜色创建对象,请WallpaperColors 通过传递一级,二级和三级颜色来创建该类的实例。原色不能为空。
* 要从WallpaperColors 位图创建对象,请fromBitmap() 通过传递位图源作为参数来调用该方法。
* 要从WallpaperColors drawable 创建一个对象,请fromDrawable() 通过传递可绘制的源作为参数来调用该方法。
要从壁纸检索主要,次要或第三个颜色细节,请调用以下方法:
* getPrimaryColor() 返回壁纸最具视觉代表性的颜色。
* getSecondaryColor() 返回壁纸的第二个最显着的颜色。
* getTertiaryColor() 方法返回壁纸的第三个最显着的颜色。
要通知系统有关您的动态壁纸的任何重大的颜色变化,请调用该notifyColorsChanged() 方法。onComputeColors()在有机会提供新WallpaperColors 对象的情况下,此方法会触发生命周期事件。
要添加用于颜色更改的侦听器,可以调用该addOnColorsChangedListener()方法。您也可以调用该getWallpaperColors()方法来检索壁纸的主要颜色。
#### **指纹更新**
该FingerprintManager班先后引进了以下错误代码:
* FINGERPRINT_ERROR_LOCKOUT_PERMANENT - 用户尝试使用指纹读取器解锁设备的次数过多。
* FINGERPRINT_ERROR_VENDOR - 发生特定于供应商的指纹识别器错误。
#### **加密更新**
Android 8.1已经进行了许多密码修改:
* 新的算法已经在Conscrypt中实现。Conscrypt实现优先用于现有的Bouncy Castle实现。新算法包括:
* AlgorithmParameters:GCM
* KeyGenerator:AES
* KeyGenerator:DESEDE
* KeyGenerator:HMACMD5
* KeyGenerator:HMACSHA1
* KeyGenerator:HMACSHA224
* KeyGenerator:HMACSHA256
* KeyGenerator:HMACSHA384
* KeyGenerator:HMACSHA512
* SecretKeyFactory:DESEDE
* Signature:NONEWITHECDSA
* Cipher.getParameters().getParameterSpec(IvParameterSpec.class)不再适用于使用GCM的算法。相反,使用 getParameterSpec(GCMParameterSpec.class)。
* 与TLS相关的许多内部的加密类被重构。由于开发人员有时会反射地访问这些内容,所以垫片已经被留下以支持以前的使用,但是一些细节已经改变。例如,之前的套接字是类型的OpenSSLSocketImpl,但是现在它们是类型的, ConscryptFileDescriptorSocket或者 ConscryptEngineSocket两者都扩展 OpenSSLSocketImpl。
* SSLSessionIllegalArgumentException当传递一个空引用时抛出的方法被 抛出NullPointerException。
* RSA KeyFactory不再允许从字节数组中生成大于编码密钥的密钥。调用 generatePrivate()并 generatePublic()提供一个 KeySpec关键结构不填充整个缓冲区的地方将导致一个InvalidKeySpecException。
* 当套接字读取被关闭的套接字中断时,Conscrypt用于从读取中返回-1。现在阅读抛出 SocketException。
* 根CA证书集已被更改,大部分删除了大量的废弃证书,同时也删除了WoSign和StartCom的根证书。有关此决定的更多信息,请参阅Google安全博客文章, [WoSign和StartCom证书的最终删除信任](https://security.googleblog.com/2017/07/final-removal-of-trust-in-wosign-and.html)。
- 前言
- Google官网对Android API各版本的介绍
- jelly Bean(果冻豆)Android 4.1、4.2、4.3
- Android 4.1
- Android 4.2
- Android 4.3
- KitKat(Android 4.4.*)巧克力
- Android 4.4 APIS
- Lollipop(棒棒糖)Android 5.*
- Android 5.0 APIs
- Android 5.0 Changes(变更)
- Android 5.1APIs
- Marshmallow(棉花糖)Android 6.0
- Android 6.0 APIs
- Android 6.0 Changes(变更)
- Android 6.0 Samples
- Android 6.0 Testing
- Nougat(牛扎塘)Android 7.*
- Android 7.0
- API
- 行为变更
- 示例
- Android 7.1
- 开发者API
- 示例Sample
- Oreo(奥利奥)8.*
- Android 8.0
- 功能和 API
- Android 8.0 行为变更
- 向 Android 8.0 迁移应用
- Android 8.0 示例
- Android 8.1
- 后台执行限制
- 后台位置限制
- API指南
- Android 简介
- 应用基础知识
- 设备兼容性
- 系统权限
- 请求权限
- 定义权限
- 平台架构
- Java8 概览
- 在ART上验证应用行为
- 应用组件
- Intent 和 Intent 过滤器(Google官网介绍)
- 通用intent
- Activity
- 任务和返回栈(官网译文)
- 概览屏幕
- 活动简介
- 活动生命周期
- 活动状态更改
- 进程和应用程序生命周期
- 包裹和捆绑
- 最近的屏幕
- 片段
- 加载器
- 服务Service
- 绑定服务
- AIDL
- 内容提供程序
- 内容提供程序基础知识
- 创建内容提供程序
- 日历提供程序
- 联系人提供程序
- 存储访问框架
- 使用存储访问框架打开文件
- 创建自定义文档提供程序
- 应用小部件
- 应用小部件主机
- 进程和线程
- 应用资源
- 概览
- 提供资源
- 访问资源
- 处理运行时变更
- 本地化
- ICU4J Android框架API
- Android上的国际化
- 语言和语言区域
- 复杂的XML资源
- 资源类型
- 动画
- 颜色状态列表
- 可绘制对象
- 布局
- 菜单
- 字符串
- 样式
- 其他类型
- 应用清单
- <action>
- <activity>
- <activity-alias>
- <application>
- <category>
- <compatiable-screens>
- <data>
- <grant-uri-permission>
- <intent-filter>
- <manifest>
- <meta-data>
- <path-permission>
- <permission>
- <permission-group>
- <permission-tree>
- <provider>
- <receiver>
- <service>
- <supporte-gl-texture>
- <supports-screens>
- <uses-configuration>
- <uses-feature>
- <uses-library>
- <uses-permission>
- <uses-permission-sdk-23>
- <uses-sdk>
- 用户界面
- 界面概览
- 界面布局
- 线性布局
- 相对布局
- 列表视图
- 网格视图
- 回收站视图
- 外观和感觉
- 可下载的字体
- XML中的字体
- 表情符号兼容性
- 自动调整TextView
- 样式和主题-
- 输入控件
- 按钮
- 文本字段
- 复选框
- 单选按钮
- 切换按钮
- 微调框
- 选取器
- 输入事件
- 菜单Menu
- 设置
- 对话框
- 通知
- Toast
- 自适应图标
- 应用快捷方式
- 搜索
- 创建搜索界面
- 添加近期查询建议
- 添加自定义建议
- 可搜索配置
- 多窗口支持
- 拖放
- 无障碍功能
- 为应用设置无障碍功能
- 无障碍功能开发者检查单
- 构建无障碍服务
- 让应用更容易访问
- 使用节点树调试
- 构建可访问自定义视图
- 样式和主题
- 自定义组件
- 动画和图形
- 概览介绍
- 属性动画
- 视图动画
- 可绘制动画
- 画布和可绘制对象
- 基于物理的动画
- Spring Animation
- Fling Animation
- OpenGL ES
- 硬件加速
- 计算
- RenderScript
- 高级RenderScript
- Runtime API Reference(参考)
- Numerical Types(数字类型)
- Object Types(对象类型)
- Conversion Functions(转换函数)
- Mathematical Constants and Functions(数学常量和函数)
- Vector Math Functions(矢量数学函数)
- Matrix Functions(矩阵函数)
- Quaternion Functions(四元数函数)
- Atomic Update Functions(原子更新函数)
- Time Functions and Types(时间函数和类型)
- Allocation Data Access Functions(分配数据访问函数)
- Object Characteristics Functions(对象特性函数)
- Kernel Invocation Functions and Types(内核调用函数和类型)
- Input/Output Functions(输入输出函数)
- Debugging Functions(调试函数)
- Graphics Functions and Types(图形函数和类型)
- Index(索引)
- Media Apps(媒体应用)
- Media Apps Overview(媒体应用程序概述)
- Working with a Media Session(使用媒体会话)
- Building an Audio App(建立一个音频应用)
- Building a Media Browser Service(构建媒体浏览器服务)
- Building a Media Browser Client(构建媒体浏览器客户端)
- Media Session Callbacks(媒体会话回调)
- Building a Video App(建立一个视频应用)
- Building a Video Player Activity(建立一个视频播放器Activity)
- Media Session Callbacks-(媒体会话回调)
- Responding to Media Buttons(响应媒体按钮)
- Handling Changes in Audio Output(处理音频输出的变化)
- Managing Audio Focus(管理音频焦点)
- The Google Assistant and Media Apps(Google智能助理和媒体应用)
- 媒体和相机
- Supported Media Formats(支持的媒体格式)
- MediaPlayer(媒体播放器)
- MediaRecorder
- ExoPlayer
- Controller Amplitude with VolumeShaper(VolumeShaper控制器振幅)
- Media Routing(媒体路由)
- MediaRouter API
- MediaRouteProvider API
- Camera API(相机API)
- 位置和传感器
- Location and Maps(位置和地图)
- Location Strategies(位置策略)
- Sensors Overview(传感器概览)
- Motion Sensors(运动传感器)
- Position Sensors(位置传感器)
- Environment Sensors(环境传感器)
- Raw GNSS Measurements(原始的GNSS测量)
- 连接
- Bluetooth
- Bluetooth Low Energy(蓝牙低功耗)
- NFC
- NFC Basics(NFC基础知识)
- Advanced NFC(高级NFC)
- Host-based Card Emulation(基于主机的卡模拟)
- Telecom(电信)
- Self-Managed ConnectionServices(自我管理的连接服务)
- Wi-Fi P2P
- Wi-Fi Aware
- Companion Device Pairing
- USB
- Accessory(配件)
- Host(主机)
- SIP
- 文本和输入
- Autofill Framework(自动填充框架)
- Test your app with autofill(使用自动填充测试你的应用)
- Building autofill services(构建自动填充服务)
- Copy and Paste(复制和粘贴)
- Creating an IME(创建IME)
- Image Keyboard(图像键盘)
- Spelling Checker(拼写检查程序)
- 数据存储
- Storage Options(存储选项)
- Data Backup(数据备份)
- Account Transfer API(账户转移API)
- Auto Backup(自动备份)
- Key/Value Backup(键值备份)
- Testing Backup and Restore(测试备份和还原)
- App Install Location(应用安装位置)
- 库
- 支持库
- 功能
- 修订历史记录
- 库设置
- 数据绑定库
- 测试支持库
- 管理
- 设备策略
- 网络应用
- Supporting Different Screens in Web Apps(在网络应用中支持不同屏幕)
- Building Web Apps in WebView(在WebView中构建网络应用)
- Managing WebViews
- Migrating to WebView in Android 4.4(迁移到Android4.4中的WebView)
- Debugging Web Apps(调试网络应用)
- Best Practices for Web Apps(网络应用最佳做法)
- 最佳实践
- Supporting Multiple Screens(支持多种屏幕)
- Distributing to Specific Screens(分配到特定屏幕)
- Screen Compatibility Mode(屏幕兼容性模式)
- Designing for Seamlessness
- Supporting Tablets and Handsets
- 培训