为Android Q准备应用程序。第1部分

本文的翻译是专门为“ Android-developer”课程的学生准备的 基础课程 我们还提醒您,我们将继续注册高级课程“ Specialization Android-developer”





我们处于Android开发的第十年(Android Q必须为10.0版)。 根据Beta 4,Android Q正式具有29级API 。 尽管已经存在Beta 5 ,并且有望推出Beta 6,但该API已被标记为最终版本,现在是时候看看Android Q将如何影响应用程序以及需要进行哪些更改才能完全支持AndroidQ。


Android Q中显示的重要更改(不是全部)可以分为两类:a) 保密性和安全性 ,b) 用户体验

译者的话:“我们将翻译分为与这些类别相对应的两部分。 因此,在第一部分中,我们将讨论隐私和安全性。”

1)机密性和安全性


a)开始后台活动


当您的应用程序在后台时,您将无法再启动活动。

  • 影响因素:所有在Q上运行的应用程序(与目标SDK无关)。 如果Android Q是应用程序的目标版本,则会引发异常;否则,将抛出异常。 如果Android Q不是该应用程序的目标SDK,那么Activity就不会启动,但它可以在装有Android Q的设备上运行。
  • 例外:绑定服务,例如可访问性,自动完成等。如果应用程序从系统接收到PendingIntent ,则可以使用它来启动Activity。 如果该应用程序具有SYSTEM_ALERT_WINDOW权限(在Android GO中已删除)或最近为Activity调用finish()的应用程序finish()建议不要依赖它。“最近”可能非常含糊),则您的应用程序不受此限制。
  • 推荐方法:通知触发活动

 val fullScreenIntent = Intent(this, CallActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) .... .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(NotificationCompat.CATEGORY_CALL) .setFullScreenIntent(fullScreenPendingIntent, true) 

Fullscreen PendingIntent添加到通知中。 通知已生效,系统将启动全屏Intent。

因此,如果我们要从后台启动Activity,请首先创建一个通知,该通知将显示给用户。 在此通知中,添加Fullscreen PendingIntent 。 另外,将USE_FULL_SCREEN_INTENT权限添加到清单中。 通知已生效,系统将启动全屏Intent。

  • 陷阱:系统决定何时显示通知以及何时显示活动。 如果用户正在使用设备,则会显示一个弹出通知。 如果设备处于静止状态或当用户与通知交互时,将启动全屏活动。 例如,如接听电话时(使用电话时弹出通知,否则全屏活动)。

b)硬件标识符


Android Q已撤消了对不可重置的设备标识符的访问。

  • 影响因素:所有在Q上运行的应用程序(与目标SDK无关)。 如果Q是目标SDK,则抛出异常。 如果目标SDK小于Q,则返回null
  • 避免: Mac地址现在是随机的,并且IMEI( TelephonyManager.getDeviceId() )和序列号不再可用。 现在,它们是“特权权限”,并且仅可用于操作员应用程序。
  • 推荐的方法:使用可重置的标识符,例如广告ID,实例ID或全局唯一ID(GUID)。 有关在这种情况下使用哪个标识符的更多信息,请参见唯一标识符的最佳做法

c)位置的背景定义


从Android Q开始,系统将区分在前台和后台发出的位置请求。


现在,访问该位置的权限请求将具有3个选项:始终允许,仅在使用该应用程序时允许(仅在前台访问)和拒绝(没有访问权)。

  • 它会影响什么:它取决于目标SDK。 如果Q是应用程序的目标SDK,则需要在后台请求新的位置许可。 如果应用程序具有其他目标SDK,则如果它已经对该位置具有访问权限,它将自动获得此权限。


图片取自Android开发者文档

  • 推荐的方法:如果应用程序需要一次性访问用户的位置来执行某些任务,请使用前台服务,并将前台服务类型参数指定为应用程序清单文件中的location

 <service android:name="MyNavigationService" android:foregroundServiceType="location" ... /> 

如果应用程序需要不断访问设备的位置,例如地理围栏,它可以配置一个请求以允许在后台访问该位置。 该应用程序的其他方面(例如,如何提取和使用位置)无需更改。 要请求访问后台位置,请向清单添加ACCESS_BACKGROUND_LOCATION权限:

 <manifest> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest> //Request for the permission like any other permission request: ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION), your-permission-request-code) 

在后台请求位置访问

  • 陷阱:


系统显示的有关在后台访问位置的提醒

需要牢记的一些重要事项:在为应用程序授予其在后台访问设备位置的权限后,可以提醒用户,并且像其他任何权限一样,用户可以撤消该权限。 对于其中Q不是目标SDK但在具有Android Q的设备上运行的应用程序来说,这尤其重要,因为如果具有位置许可,它将获得默认的背景分辨率。 确保您的应用程序可以正常处理此类脚本。 因此,无论何时应用程序启动服务或请求位置,请检查用户是否仍允许应用程序访问位置信息。

至此,本文的第一部分结束了,正如所承诺的,我们将在第二部分中讨论用户体验。

Source: https://habr.com/ru/post/zh-CN463811/


All Articles