AsyncTask
AsyncTask在Android 11已经不建议使用,建议迁移至kotlin的协程。
此外Handler未指定Looper的构造方法也已不建议使用。
建议明确指定Looper:
private Handler handler = new Handler(Looper.myLooper()); // 或 private Handler handler = new Handler(Looper.getMainLooper());
状态栏高度
发现系统为Android 11的手机上targetSdkVersion
是30时获取状态栏高度为0,低于30获取值正常。。。因此需要使用WindowMetrics 适配一下:
public static int getStatusBarHeight(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); WindowInsets windowInsets = windowMetrics.getWindowInsets(); Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout()); return insets.top; } .... }
WindowMetrics是Android
11新增的类,用于获取窗口边界,同样可以用来获取导航栏高度。
5.新增工具
兼容性调试工具
以往我们做适配的时候,需要先将我们项目中的 targetSdkVersion
修改为对应版本。这就导致你适配过程中有可能受到其他变更的影响,而这个新增的兼容性调试工具可以让你在不升级targetSdkVersion的情况下,针对每项变更逐个开启适配。
使用方法:
- 开发者选项中找到应用兼容性变更选项。
- 点击进入找到你需要调试的应用
- 在变更列表中,找到想要开启或关闭的变更,然后点击相应的开关。
上面第一行DEFAULT_SCOPED_STORAGE就是启用分区储存,这些常量详细的含义见:Android 11
变更列表。
对于兼容性调试工具详细的使用方法见:兼容性框架工具,这里限于篇幅就不展开说了。
无线调试
Android 11的开发者选项中添加了一个无线调试的功能。类似于连接蓝牙耳机功能,可以无需USB连接线进行日常开发调试工作。(区别于以前的Android
WIFI ADB,这个是真无线,哈哈)
使用方法:
- 开发者选项中找到无线调试并打开。
- 首次配对需点击“使用配对码配对设备”
- 运行 adb pair ipaddr:port后输入配对码进行连接。
注意事项:
- 保持电脑和手机在一个网络。
- Platform Tools 版本需大于30.0。可使用adb --version查看。
不过我自己体验下来,感觉连接不是很稳定,不知是AS的问题还是手机问题。同时锁屏后也会断开连接,体验不是很好。。。期待后续的优化吧。
本篇内容有点多。总结一下,Android
11在权限上的变更比较多,但如果你一直遵守申请权限相关的最佳做法,那么基本上不需要额外的适配工作。
最后强调一下,对于 单次授权,权限对话框的可见性,SYSTEM_ALERT_WINDOW 权限,安装apk 这些变更只要在Android
11上就会生效,不论你是否适配Android
11。对于其他变更和API(相机、5G、瀑布屏、键盘等),因为我暂时没有遇到,也就没有列出,有需要的可以点击文末的官方文档链接查看。
截止发这篇博客时,我手机上只发现哔哩哔哩已经适配了Android 11。大多数停留在28、29,更有甚者还在26(Android 8.0
国内上架的最低适配标准)。
所以我顺便附上之前写的Android 9、10的适配攻略:
可能本篇你暂时也用不上,你可以不用,但是不能没有。点赞收藏一波不过分吧~~