Android 10(Q)版本适配指南

Android 10 引入了多项功能和行为变更,例如改进了系统界面、让权限授予更加严格以及限制应用能够操作哪些数据,目的是为了更好地保护用户的隐私并最大限度地提升用户对应用的控制权。这些变更可能意味着应用所依赖的特定行为或数据会与较低版本的平台有所不同,因此开发者需要采取一些措施来应对这些改变。

一、重大变更

外部存储权限变更

1、访问外部存储空间

默认情况下,对于以 Android 10 及更高版本为目标平台的应用,其访问权限范围限定为外部存储,即分区存储。此类应用可以查看外部存储设备内以下类型的文件,无需请求任何与存储相关的用户权限。访问权限范围限定为应用文件和媒体

  • 特定于应用的目录中的文件(使用 getExternalFilesDir() 访问)。
  • 应用创建的照片、视频和音频片段(通过媒体库访问)。

2、将文件保存到外部存储

对于您要与其他应用共享或允许用户使用计算机访问的文件,将其存储在外部存储上是很好的选择。

请求存储权限确认存储可用后可以保存以下类型的文件:

  • 公开文件:应可供其他应用和用户自由访问的文件。在用户卸载您的应用后,这些文件应该仍然可供用户使用。例如,您的应用拍摄的照片应保存为公开文件。

如果要将文件保存到其他应用可以访问的外部存储上,请使用以下 API 之一:

  • 如果要保存照片、音频文件或视频剪辑,请使用 MediaStore API。
  • 如果要保存任何其他文件(如 PDF 文档),请使用 ACTION_CREATE_DOCUMENT intent,这是存储访问框架的一部分。

如果您不希望媒体扫描程序发现您的文件,请在特定于应用的目录中添加名为 .nomedia 的空文件(请注意文件名中的句点前缀)。这可以防止媒体扫描程序读取您的媒体文件并通过 MediaStore API 将它们提供给其他应用。

  • 私有文件:存储在特定于应用的目录中的文件。如果想将应用专用文件保存在外部存储上,可以通过调用getExternalFilesDir() 并传入指明您想要的目录类型的名称来获取特定于应用的目录,建议使用系统定义好的常量作为参数(例如Environment.DIRECTORY_DCIM)。通过这种方式创建的每个目录都会被添加到一个父目录中,该目录包含了应用的所有外部存储文件,当用户卸载应用时,系统会清除这些文件

在后台运行时访问设备位置信息需要权限

为了让用户更好地控制应用对位置信息的访问权限,Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。

ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限不同,ACCESS_BACKGROUND_LOCATION 权限仅会影响应用在后台运行时对位置信息的访问权限。除非符合以下条件之一,否则应用将被视为在后台访问位置信息:

  • 属于该应用的 Activity 可见。
  • 该应用运行的某个前台设备已声明前台服务类型为 location

要声明您的应用中的某个服务的前台服务类型,请将应用的 targetSdkVersioncompileSdkVersion 设置为 29 或更高版本。详细了解前台服务如何继续执行用户发起的需要访问位置信息的操作。

1、以 Android 9 或更低版本为目标平台时自动授予访问权限

如果您的应用在 Android 10 或更高版本上运行,但其目标平台是 Android 9(API 级别 28)或更低版本,则该平台具有以下行为:

  • 如果您的应用为 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 声明了 元素,则系统会在安装期间自动为 ACCESS_BACKGROUND_LOCATION 添加 元素。
  • 如果您的应用请求了 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION 添加到请求中。

2、在设备升级到 Android 10 后访问

如果用户向您的应用授予对设备位置信息的访问权限(ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION),然后将其设备从 Android 9 升级到 Android 10,则系统会自动更新应用已获取的基于位置信息的那组权限。您的应用在设备升级后接收的那组权限取决于应用的目标 SDK 版本及其定义的权限,如下表所示:

Android 10(Q)版本适配指南_第1张图片
设备升级至 Android 10 之后位置权限状态发生的变化

注意:即使在系统自动更新应用对设备位置信息的访问权限之后,用户仍然可以选择更改这种访问权限级别。用户可以选择让应用只能在前台访问位置信息,或者完全撤消使用权。在尝试访问设备的位置信息之前,尤其是在前台服务中,您的应用应检查用户是否仍然允许您的应用接收此类位置信息。

如需详细了解如何在应用在后台运行时检索设备的位置信息,请参阅有关如何定期接收位置信息更新的指南。


针对从后台启动 Activity 的限制

从 Android 10 开始,系统会增加针对从后台启动 Activity 的限制。此项行为变更有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。只要您的应用启动 Activity 是因用户互动直接引发的,该应用就极有可能不会受到这些限制的影响。

1、将通知作为从后台启动 Activity 的备选方案

几乎在所有情况下,后台应用都应显示有时效性的通知,以便向用户提供紧急信息,而非直接启动 Activity。此类通知的适用情形包括处理来电或正在响铃的闹钟。

这种基于通知的提醒系统可为用户提供以下若干优势:

  • 当用户使用设备时,系统会显示浮动通知,以便用户作出响应。用户可以维护其当前上下文,并控制自己在屏幕上看到的内容。
  • 有时效性的通知遵循用户的请勿打扰规则。例如,启用“请勿打扰”功能后,用户可以仅允许特定联系人或重复来电者的来电。
  • 设备屏幕关闭时,您的全屏 intent 会立即启动。
  • 在设备的 Settings 屏幕中,用户可以查看哪些应用最近发送了通知(包括来自特定通知渠道的通知)。在该屏幕中,用户可以控制其通知偏好设置。

2、限制的例外情况

在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:

  • 应用具有可见窗口,例如前台 Activity。

  • 应用在前台任务的返回栈中拥有 Activity。

  • 应用在 Recents 屏幕上现有任务的返回栈中拥有 Activity。

    注意:当此类应用尝试启动新的 Activity 时,系统会将该 Activity 放置到应用现有任务的顶部,但不会离开当前可见的任务。当用户稍后返回应用任务时,系统会启动新的 Activity,而不是之前放置在应用任务顶部的 Activity。

  • 应用的某个 Activity 刚在不久前启动。

  • 应用最近为某个 Activity 调用了 finish()。这仅适用于在调用 finish() 时,应用在前台或前台任务的返回栈中拥有 Activity 的情况。

  • 应用具有受系统约束的服务。此情况仅适用于以下服务,这些服务可能需要启动界面:AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileServiceVoiceInteractionServiceVrListenerService

  • 应用中的某个服务受另一个可见应用约束。请注意,绑定到服务的应用必须保持可见,以便后台应用成功启动 Activity。

  • 应用收到系统的 PendingIntent 通知。对于服务和广播接收器的挂起 Intent,应用可在该挂起 Intent 发送几秒钟后启动 Activity。

  • 应用收到另一个可见应用发送的 PendingIntent

  • 应用收到它应该在其中启动界面的系统广播。示例包括 ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION。应用可在广播发送几秒钟后启动 Activity。

  • 应用通过 CompanionDeviceManager API 与配套硬件设备相关联。此 API 支持应用启动 API,以响应用户在配对设备上执行的操作。

  • 应用是在设备所有者模式下运行的设备政策控制器。示例用例包括完全托管的企业设备,以及数字标识牌和自助服务终端等专用设备。

  • 用户已向应用授予 SYSTEM_ALERT_WINDOW 权限。


原文链接:https://developer.android.google.cn/about/versions/10

你可能感兴趣的:(Android 10(Q)版本适配指南)