当 Android 的 Compat 库不能拯救你的时候(1)

编译器并不在意我们使用 NotificationManagerCompat 来达到目的。

我们有多种方法来解决这个问题。

RequiresApi 注解添加到我们的方法中并没有什么意义,因为我们会简单地将警告移到调用函数中。用检查包围似乎已经过时了,因为这个检查已经由 NotificationManagerCompat 完成,如上图所示。

看来最好的选择是选择抑制这个警告。

@SuppressLint(“NewApi”)
private fun checkChannels() {
val groups = notificationManagerCompat.notificationChannelGroups
val channels = groups.flatMap {
it.channels.filter { it.shouldShowLights() }
}

}

新的需求即将到来

假设我们得到了额外的要求,我们需要过滤掉被屏蔽的组。我们可以为此添加一个简单的检查:

@SuppressLint(“NewApi”)
private fun checkChannels() {
val groups = notificationManager.notificationChannelGroups
val channels = groups.filterNot { it.isBlocked }.flatMap {
it.channels.filter { it.shouldShowLights()}
}

}

一切看起来都很好,对吗?

你完了!

但我们刚刚引入了一个崩溃!

原因是:isBlocked 是在 API 28 才引入的,而我们没有进行检查! 尽管我们使用了 NotificationManagerCompat,但我们还是遇到了 API 级别上的问题!

而且因为我们抑制了 NewApi 的警告,所以我们在这个问题上没有收到任何警告!

所以当涉及到抑制警告的时候,我们就应该更加审慎!

解决方案?

由于只有在方法级别上才能解决这个问题(不适用单个语句),最好的方法是编写能满足我们需求的单行的方法。

多亏了扩展函数,这可以非常容易地实现:

@SuppressLint(“NewApi”) // SDK 26
fun NotificationChannelGroup.lightingChannels() =
channels.filterLightingOnes()

@SuppressLint(“NewApi”) // SDK 26
private fun List.filterLightingOnes() =
filter { it.shouldShowLights() }

如果我们在上面的例子中使用这种方法,我们在添加 isBlocked 的时候就会得到警告:

当然,这对于我们开发者来说多了很多工作,但是我们的用户会很喜欢一个无崩溃的应用。

The Linter

上述例子不是 Compat 库的 Bug,而是被抑制隐藏了。这种情况也可能发生在许多其他 API 上。

  • 不要掉进这个陷阱!
  • 使用 Compat 库可能会给我们带来虚假的安全感,并欺骗我们相信我们不必考虑这些问题。

而且再次强调,尽量避免抑制 NewApi 警告

相反,我们应该使用直接的版本检查,比如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)

不幸的是,lint 在这里不是很智能。它不会理解一些变型的版本检查,比如说:

.filter { Build.VERSION.SDK_INT >= Build.VERSION_CODES.P }

求助?

也许你们中的一些人想更多地研究这个,用一些自定义的 lint 规则。基本上,我们需要这样的东西:

@CheckedUpTo(Build.VERSION_CODES.P)
这将在内部完成类似于 SuppressLint("NewApi") 的工作,但只会针对不需要高于 P 版本的 API 调用。
目前,你可以让现有的 lint 功能为你工作。例如也可以在你自己的代码中添加 @RequiresApi(Build.VERSION_CODES.P),强制让你处理这些问题。
记住,这些注释也被认为是你的代码读者的文档。
PS: 最新的 NotificationCompat alpha 版本将为我们带来 NotificationChannelNotificationChannelGroup 的兼容版本。🥳

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

识点、常见算法题汇总。)

[外链图片转存中…(img-SvfUeA1B-1712409140637)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值