开始适配Android 12

Android面试技术要点汇总
2022-07-05 14:13 · 阅读时长4分钟
小课

现在Android 12已经正式发布,很多应用都已经适配Android 12了,今天我们就来看看适配Android 12需要注意的地方。

目标版本targetSdkVersion

首先我们要把targetSdkVersion和compileSdkVersion升级到31,关于这两者的区别和联系可以参考compileSdkVersion和targetSdkVersion的区别

android {
    compileSdkVersion 31
    defaultConfig {
        applicationId "com.your.application"
        minSdkVersion 26
        targetSdkVersion 31
    }
}
更安全的组件导出exported

为所有使用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的指南可以参考官方文档

android 12适配exported