现在Android 12已经正式发布,很多应用都已经适配Android 12了,今天我们就来看看适配Android 12需要注意的地方。
首先我们要把targetSdkVersion和compileSdkVersion升级到31,关于这两者的区别和联系可以参考compileSdkVersion和targetSdkVersion的区别。
android {
compileSdkVersion 31
defaultConfig {
applicationId "com.your.application"
minSdkVersion 26
targetSdkVersion 31
}
}
为所有使用Intent Filters的Activity、Service、Broadcast显式的设置android:exported属性,即使是false也需要设置,否则应用无法在Android 12及以上版本的设备上安装。一般情况下,我们会将LAUNCHER 类别的组件exported属性设置为true,其它不对外导出的设置为false。
<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>
为了更合理的使用闹钟权限,节省系统资源,从Android 12开始,如果想要使用AlarmManager在某个精确的时间点提醒用户,就需要在AndroidManifest申明使用SCHEDULE_EXACT_ALARM权限。
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
虽然在申明了就可以使用,但是需要注意的是,用户可以在设置中取消该权限,所以在使用AlarmManager的setExact...等接口时,我们需要使用canScheduleExactAlarms检测一下用户是否授权该权限。
除了一些特殊情况外,不能在应用处于后台运行时启动前台服务,否则将会抛出ForegroundServiceStartNotAllowedException。如果不确定应用中是否有这种行为,可以通过以下命令检测,当应用中出现这种行为时,会在通知栏提示
adb shell device_config put activity_manager \
default_fgs_starts_restriction_notification_enabled true
对于应用在后台运行时,可以通过WorkManager来完成一些加急的任务,这是WorkManager 2.7.0新加入的功能,如果是完成用户设置的任务,可以通过精确的闹钟启动前台服务。
在Android 11时,如果应用长时间未使用,该应用之前授权的运行时权限将会被收回,而在Android 12及以上版本,还额外会让应用处于休眠状态,处于休眠状态的应用无法在后台运行任务,也不能接收推送消息,另外应用cache目录下的文件也会被移除。
更多关于适配Android 12的指南可以参考官方文档。