Android 8.0 行为变更(一)针对所有 API 级别的应用

后台执行限制

Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。
此外,为提高设备性能,系统会限制未在前台运行的应用的某些行为。

具体而言:
  • 后台 Service 限制:
    处于空闲状态时,应用可以使用的后台 Service 存在限制。 这些限制不适用于前台 Service,因为前台 Service 更容易引起用户注意。
  • 广播限制:
    除了有限的例外情况,应用无法使用清单注册隐式广播。 它们仍然可以在运行时注册这些广播,并且可以使用清单注册专门针对它们的显式广播。
    默认情况下,这些限制仅适用于针对 O 的应用。不过,用户可以从 Settings为任意App启用这些限制,即使应用并不是以 O 为目标平台。
Android 8.0 还对特定函数做出了以下变更:

如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

官方建议

多使用 JobScheduler 来处理后台任务,详细的适配指南:后台执行限制。

Android 后台位置限制

为节约电池电量,在运行 Android 8.0 的设备上使用后台应用时,降低了后台应用接收位置更新的频率。此行为变更会影响所有接收位置更新的应用。详细的适配指南:后台位置限制

应用快捷键

Android 8.0 对应用快捷方式做出了以下变更:

  • com.android.launcher.action.INSTALL_SHORTCUT 变为私有的隐式广播,它不再对您的应用有任何影响。官方建议:使用 ShortcutManager 类中的 requestPinShortcut() 函数创建应用快捷方式。
  • 现在,ACTION_CREATE_SHORTCUT Intent 可以创建可使用 ShortcutManager 类进行管理的应用快捷方式。此 Intent 还可以创建不与 ShortcutManager 交互的旧版启动器快捷方式。在以前,此 Intent 只能创建旧版启动器快捷方式。
  • 现在,使用 requestPinShortcut() 创建的快捷方式和在处理 ACTION_CREATE_SHORTCUT Intent 的操作组件中创建的快捷方式均已转换为功能齐全的应用快捷方式。因此,应用现在可以使用 ShortcutManager 中的函数来更新这些快捷方式。
  • 旧版快捷方式仍然保留了它们在旧版 Android 中的功能,但您必须在应用中手动将它们转换成应用快捷方式。
    详情可以参阅 固定快捷方式和微件预览功能指南

语言区域和国际化

Android 7.0(API 级别 24)引入能指定默认类别语言区域的概念。在 Android 8.0 中,以下函数使用 Locale.getDefault(Category.DISPLAY) 来代替 Locale.getDefault():

  • Currency.getDisplayName()
  • Currency.getSymbol()
  • Locale.getDisplayScript()

当为 Locale 参数指定的 displayScript 值不可用时,Locale.getDisplayScript(Locale) 同样回退到 Locale.getDefault()。

与语言区域和国际化有关的其他变更如下:

  • 调用 Currency.getDisplayName(null) 会引发 NullPointerException,以与文档规定的行为保持一致。
  • 时区名称的分析方法发生变化。之前,Android 设备使用在启动时取样的系统时钟值,缓存用于分析日期时间的时区名称。因此,如果在启动时或其他较为罕见的情况下系统时钟出错,可能对分析产生负面影响。
    现在,一般情况下,在分析时区名称时分析逻辑将使用 ICU 和当前系统时钟值。此项变更可提供更加准确的结果,如果您的应用使用 SimpleDateFormat 等类,此结果可能与之前的 Android 版本不同。
  • Android 8.0 将 ICU 的版本更新至版本 58。

提醒窗口

使用 SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口:

  • TYPE_PHONE
  • TYPE_PRIORITY_PHONE
  • TYPE_SYSTEM_ALERT
  • TYPE_SYSTEM_OVERLAY
  • TYPE_SYSTEM_ERROR
    相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型。

使用 TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,请记住新窗口类型的以下特性:

  • 应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面。
  • 系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果。
  • 通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。

输入和导航

在 Chrome 操作系统和平板电脑等其他大尺寸设备上,用户在 Android 应用中又重新开始使用键盘导航。在 Android 8.0 中,我们又再次使用键盘作为导航输入设备,从而为基于箭头键和 Tab 键的导航构建了一种更可靠并且可预测的模型。

尤其要指出的是,我们对元素焦点行为做出以下变更:

  • 现在,如果您没有为 View 对象(前景或背景图片)定义任何焦点状态颜色,框架会为 View 设置默认的焦点突出显示颜色。此焦点突出显示标志是基于操作组件主题背景的涟漪图片。

  • 如果您不希望 View 对象在接收焦点时使用此默认突出显示标志,请在包含 View 的布局 XML 文件中将 android:defaultFocusHighlightEnabled 属性设置为 false,或者将 false 传递至应用界面逻辑中的 setDefaultFocusHighlightEnabled()。

要测试键盘输入对界面元素焦点有何影响,您可以启用 Drawing > Show layout bounds 开发者选项。在 Android 8.0 中,此选项在当前具有焦点的元素上显示一个“X”图标。

网页表单自动填充

现在,Android 自动填充框架提供对自动填充功能的内置支持,对于安装到运行 Android 8.0 的设备上的应用,与 WebView 对象相关的下列函数已经发生变化:

  • WebSettings
    • getSaveFormData() 函数现在返回 false。之前,此函数返回 true。
    • 调用 setSaveFormData() 不再有任何效果。
  • WebViewDatabase
    • 调用 clearFormData() 不再有任何效果。
    • hasFormData() 函数现在返回 false。之前,当表单包含数据时,此函数返回 true。

无障碍功能

现在,无障碍服务可识别应用的 TextView 对象内部的所有 ClickableSpan 实例。

网络连接和 HTTP(S) 连接

Android 8.0 对网络连接和 HTTP(S) 连接行为做出了以下变更:

  • 无正文的 OPTIONS 请求现在有 Content-Length: 0 标头。
  • HttpURLConnection 在包含斜线的主机或颁发机构名称后面附加一条斜线,如,它将 http://example.com 转化为 http://example.com/。
  • 通过 ProxySelector.setDefault() 设置的自定义代理选择器仅针对所请求的网址(架构、主机和端口)。
  • URI 不能包含空白标签。Android 8.0 在实现 HttpsURLConnection 时不会执行不安全的 TLS/SSL 协议版本回退。

对隧道 HTTP(S) 连接处理进行了如下变更:

  • 如果之前执行的 connect() 函数失败,send(java.net.DatagramPacket) 函数将会引发 SocketException。
  • 在回退到 TCP Echo 协议之前,InetAddress.isReachable() 会尝试执行 ICMP。

蓝牙

Android 8.0 对 ScanRecord.getBytes() 函数检索的数据长度做出以下变更:

  • getBytes() 函数对于所接收的字节数不作任何假定。因此,应用不应受所返回的任何最小或最大字节数的影响。相反,应用应当计算所返回数组的长度。
  • 兼容蓝牙 5 的设备返回的数据长度可能会超出之前最大约 60 个字节的限制。
  • 如果远程设备未提供扫描响应,则也可能返回少于 60 个字节的数据。

无缝连接

Android 8.0 对 WLAN 设置进行了多项改进,这样可以更轻松地选择能够提供最佳用户体验的 WLAN 网络

安全性

Android 8.0 包含以下与安全性有关的变更:

  • 此平台不再支持 SSLv3。
  • 在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection 不再尝试回退到之前的 TLS 协议版本并重试的权宜方法。
  • Android 8.0 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。
  • WebView 对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性。
  • APK目录的目录必须使用 sourceDir 获取此目录,而不能直接使用目录格式。您无法再用假定 APK 驻留在名称以 -1 或 -2 结尾的目录中的方式去获取APK的路径。

隐私性

Android 8.0 对平台做出了以下与隐私性有关的变更。

现在,平台改变了标识符ANDROID_ID的处理方式。

  • OTA升级对升级前的APP(API 级别 26)的应用,不改变ANDROID_ID的值;在OTA升级后,卸载并重新安装APP会改变ANDROID_ID。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。
  • 对于运行 Android 8.0上的App,ANDROID_ID 的值现在将根据 应用签署密钥和用户确定作用域 而定。应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)。
  • 只要签署密钥相同(并且App未在 OTA升级前已经被安装 Android O的某个版本),ANDROID_ID 的值在软件包卸载或重新安装时就不会发生变化。
    即使系统更新导致软件包签署密钥发生变化,ANDROID_ID 的值也不会变化

记录未捕获的异常

如果某个应用安装的 Thread.UncaughtExceptionHandler 未移交给默认的 Thread.UncaughtExceptionHandler,则当出现未捕获的异常时,系统不会终止应用。
从 Android 8.0 开始,在此情况下系统将记录异常堆栈跟踪情况;在之前的平台版本中,系统不会记录异常堆栈跟踪情况。

官方建议:

自定义 Thread.UncaughtExceptionHandler 实现始终移交给默认处理程序处理;遵循此建议的应用不受 Android 8.0 此项变更的影响。

联系人提供程序使用情况统计方法的变更

在之前版本的 Android 中,联系人提供程序组件允许开发者获取每个联系人的使用情况数据。
此使用情况数据揭示了与某个联系人相关联的每个电子邮件地址和每个电话号码的信息,包括与该联系人联系的次数以及上次联系该联系人的时间。
请求 READ_CONTACTS 权限的应用可以读取此数据。

如果应用请求 READ_CONTACTS 权限,它们仍可以读取此数据。

从 Android 8.0 开始,使用情况数据查询会返回近似值,而不是精确值。不过,Android 系统内部仍然会保留精确值,因此,此变更不会影响 auto-complete API。

集合的处理

现在,AbstractCollection.removeAll() 和 AbstractCollection.retainAll() 始终引发 NullPointerException;之前,当集合为空时不会引发 NullPointerException。

你可能感兴趣的:(Android,O,行为变更)