锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Android-12适配-行为变更:以-Android-12-为目标平台的应用

时间:2022-08-27 13:00:00 exact传感器

自定义通知

造成影响

简单来说,如果以前的话App中的通知(Notification)自定义内容视图用于填充整个通知区域。App以Android 12作为目标平台后,视图将不再填充整个区域,而是缩小到固定范围:

在这里插入图片描述

此外,如果您在设置自定义内容视图时使用所有通知,所有通知现在都可以扩展。 setCustomContentView方法,你现在需要再次使用setBigCustomContentView方法设置展开状态的样式,确保收起状态和展开状态的样式统一。

适配方案

确认显示范围缩小后的自定义内容视图样式是否可接受,如果不可接受,则可根据实际需要进行调整。

移动传感器采样限制

造成影响

当使用SensorManager如果监控频率过快,比如sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);,而且没有改变定义permission HIGH_SAMPLING_RATE_SENSORS如果有权限,就会有这种崩溃。

java.lang.SecurityException: To use the sampling rate of 0 microseconds, app needs to declare the normal permission HIGH_SAMPLING_RATE_SENSORS. at android.hardware.SystemSensorManager$BaseEventQueue.enableSensor(SystemSensorManager.java:884) at android.hardware.SystemSensorManager$BaseEventQueue.addSensor(SystemSensorManager.java:802) at android.hardware.SystemSensorManager.registerListenerImpl(SystemSensorManager.java:272) at android.hardware.SensorManager.registerListener(SensorManager.java:835) at android.hardware.SensorManager.registerListener(SensorManager.java:742) 

适配方案

在大多数情况下,我们不需要太快的监控频率,可以设置为SensorManager.SENSOR_DELAY_UI。如果确实需要快速频率监控,需要添加HIGH_SAMPLING_RATE_SENSORS权限。

导出更安全的组件

造成影响

简单来说,就是以Android 12是目标平台App,如果使用了它包含的四个组件Intent过滤器(intent-filter),必须明确声明 android:exported 属性,否则App将无法在Android 安装在12和更高系统版本的设备上

适配方案

这里要区分两种情况:

  • 如果使用自己的项目,可以按要求进行显式声明;

  • 如果是依赖的第三方库使用到了,对于这一类aar或者依赖库存component有两种解决方案:

  1. 试着升级相应的依赖库版本,看看是否已经进行了target android12适配;
  2. 在主工程中xml拷贝相关component声明,并覆盖exported例如:
android:exported="true" tools:replace="android:exported" 

应用休眠

造成影响

简单来说,就是以Android 12是目标平台App,如果用户已经好几个月没打开你了App,因此,您之前申请的所有操作权限都将被重置为未经授权的状态,即使再次打开也无法恢复,需要重新申请。

适配方案

基本上,只要你的App之前已经做好了运行时权限的判断和申请,对你有好处App几乎没有影响。如果还想安全测试,可以用Terminal终端执行adb手动触发休眠的命令:

https://developer.android.com/topic/performance/app-hibernation#manually-invoke

待处理 intent 可变性

造成影响

简单来说,就是以Android 12是目标平台App,在构建PendingIntent需要指定时间Flag为FLAG_IMMUTABLE(建议)或FLAG_MUTABLE否则,两者之一App崩溃并发出以下警告。

适配方案

但第三方库的代码也可能没有正确指定Flag除了等待第三方库更新,似乎没有更好的措施。

前台服务启动限制

造成影响

简单来说,就是以Android 12是目标平台App,如果在后台运行时尝试启动前台服务(startForegroundService),则会引发ForegroundServiceStartNotAllowedException异常(某些场景除外):

适配方案

分两步走:

  • 检查App前台服务是否在后台启动?

可在Terminal以下是终端执行adb命令,该命令会监控你的App前台服务是否在后台启动?一旦发生此行为,将在通知栏中推送提醒,并将其定位到触发此行为的代码:

adb shell device_config put activity_manager \ default_fgs_starts_restriction_notification_enabled true

  • 考虑改用WorkManager执行后台任务的紧急工作

准确的闹钟权限

造成影响

简单来说,就是以Android 12是目标平台App,若使用AlarmManager设置定时任务,设置准确的闹钟(使用setAlarmClock()、setExact()、setExactAndAllowWhileIdle()这些方法),则需要确保SCHEDULE_EXACT_ALARM权限声明且打开,否则App崩溃并发出以下警告:

适配方案

分三步走:

  • 在AndroidManifest.xml声明在清单文件中 SCHEDULE_EXACT_ALARM 权限
  • 判断是否有权设置精确的闹钟

  • 打开闹钟和提醒授权页面进行授权

通知 trampoline 限制

造成影响

简单来说,我们之前的配置通知(Notification)点按行为时,可以通过PendingIntent来启动一个Service或BrocastReceiver。而以Android 12是目标平台App,如果尝试在Service或BrocastReceiver中内调用 startActivity(),系统会阻止该Activity启动,并在 Logcat 显示以下消息:

适配方案

分两步走:

  • 排查哪个Service或BrocastReceiver有此行为

可在Terminal终端执行以下adb在您点击通知后,命令将确定哪个Service或BrocastReceiver调用了startActivity()并将相关信息输出到Logcat,可通过关键词可通过关键词NotifInteractionLog过滤:

adb shell dumpsys activity service \ com.android.systemui/.dump.SystemUIAuxiliaryDumpService

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-BTSFXONX-1656855678448)(/upload-images.jianshu.io/upload_images/5530180-07905f7731fe23a9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1140/format/webp)]

  • 考虑在配置通知(Notification)的点按行为时选择直接启动Activity

结语

还有许多的行为变更,以上我只选了几条重要的,其他变更及更详细的文档可以参见:
Android 12行为变更:以 Android 12 为目标平台的应用

以上只是针对以 Android 12 或更高版本为目标平台的应用应为变更,此外,请务必查看:
Android 12适配-行为变更:所有应用

参考

Android 12行为变更:以 Android 12 为目标平台的应用

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章