编译器并不在意我们使用 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 版本将为我们带来 NotificationChannel
和 NotificationChannelGroup
的兼容版本。🥳
如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
文末
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
识点、常见算法题汇总。)
[外链图片转存中…(img-SvfUeA1B-1712409140637)]