Android 12 适配笔记

1,139 阅读3分钟

Android 12(S)在10月份正式发布了,作为android开发者,又迎来了新一轮痛苦的适配之旅。

每一个新版本的变更中,适配都分为两种,一种是不论开发时是否将targetSdkVersion更改为为最新版,只要App运行在Android 12的手机上都得适配。另一种是开发时将targetSdkVersion更改为最新版本,才需要适配。

看了官方文档后,挑了一些个人感觉比较重要的记录一下:

1. 针对所有应用

1.1 SplashScreen

按往常的经验,启动页通常是使用一个Activity来实现,还会对这个Activity的Style中的android:windowBackground做调整,以避免这个activity显示之前还会出现白屏或者黑屏的问题。

现在Android 12新增了SplashScreen用来直接实现启动页的特殊效果,具体用法可以参考官方文档。如果你的App之前是用Activity来实现启动页,而你又没有进行适配,那么在Android 12的手机上打开App时,就会先显示新的系统启动画面,然后再显示App的启动Activity,用户体验会非常差。

1.2 深度链接

深度链接就是在手机浏览器打开一个网址后,若手机有安装对应App的情况下,可以直接进入对应App的指定页面。

在Android 12中这个功能需要进行域名验证,如果验证通过才会打开App的指定页面,若验证失败则会留在浏览器页面,验证方式可以参考官方文档

1.3 DisPlay类部分方法废弃与限制

在Android 12中DisPlay.getRealSize()和DisPlay.getRealMetrics()被废弃,现在推荐使用WindowMetrics来获取屏幕的宽高,并且提供了向下兼容至Android 4.0 的WindowManager库。

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val maximumWindowMetrics = getSystemService(WindowManager::class.java).maximumWindowMetrics
            val width = maximumWindowMetrics.bounds.width()
            val height = maximumWindowMetrics.bounds.height()
        }

1.4 应用无法关闭系统弹窗

从Android 12开始,使用包含ACTION_CLOSE_SYSTEM_DIALOG的intent无法关闭系统弹窗了。当targetSdkVersion为31时,此操作会抛出SecurityException,若没捕获异常会导致应用崩溃。当targetSdkVersion小于31时,此操作会在logcat显示错误日志。

2. 针对targetSdkVersion为31的应用

2.1 定位权限

在Android 12及以后的版本中,用户可以限制App只获得大致的定位信息。如果你的App申请定位权限时仅申请了ACCESS_FINE_LOCATION,那么你必须加上ACCESS_COARES_LOCATION。如果你的App仅申请了ACCESS_COARES_LOCATION,可以不做调整。

2.2 应用休眠

用户如果长时间没有使用你的App,那么系统会自动重置用户授予App的所有权限,并将App置为休眠状态。

2.3 包含intent-filter的Activity、Services和BroadcastReceiver

若你App中的Activity、Services、BroadcastReceiver包含了intent-filter,则必须声明android:exported属性,如果intent-filter中包含category值为LAUNCHER,exported必须为true,其余情况可设置为false。

        <activity
            android:name=".ui.home.SplashActivity"
            android:exported="true">
            
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

2.4 ForegroundService限制

在Android 12之后,应用无法在后台运行时启动ForegroundService,建议使用WorkManager来替代。