• 原文地址:When “Compat” libraries won’t save you
  • 原文作者:Danny Preussler
  • 译文出自:翻译计划
  • 本文永久链接:github.com/xitu/gold-m…
  • 译者:霜羽 Hoarfroster
  • 校对者:Kimhooogithub永久回家地址、greycodee

—— 还有为什么你应该避免运用 NewApi 抑制正告!

Compat 支撑库的概念可能是 An安全期计算器droid 主导手机领域的重要方面之一。不像是 iOS,Android 用户往往因为他们的手机不允许更新而在新版别推出后不能更新他们的操作系统,而这就是 Android 的碎片化问题。不过开发者们仍是希望在他们的使用程序中运用最新的功用来竞赛,而处理办法很简略:咱们不需求在操作系统中增加新的 APImarkdown语法,而是能够直接经过运用谷歌向咱们供给的 “回溯” 版别,直接将这些 API 和你的使用一同打包布置。

这全部都始于 Jake Wharton 开发的giti是什么牌子 ActionBar Sherlock 项目。这个项目github后来被 Google 采用,放gitlab到了他们的 支撑库 中。再后来,这个支撑库被镜安全期计算器像为 Jetpack 下的 AndroidX 项目。

相同,但也不同

从表面上看,并不是悉approach数的 Compat API 都是以相同的办法构建的。有些 API,比方google空间 Fragment 的,是由无缺的代码拷贝构建的。你要么运用操作系统中的 android.app.FragmentMarkdown(实践上现已丢掉)类,要么安全教育日运用 agiti轮胎ndroidx.fragment.app.Fragment 类。两者都不彼此同享任何代码,也没有一同的基类(这appreciate就是为什么咱们有markdown软件两个版其他 Fragment安全期Manager)。

另一方面,例如 AppCompatActivity 这个类就是简略地扩展了原本的 Activity 类。其他 AppCompatImgoogleageButton 仍然是一个 ImageButton!

咱们能够看到,有时这google商铺些 Compat安全手抄报 类仅仅起到一个桥梁的作用,用来增加缺失的功用,而有时它们甚至是完全相同的。

让咱们看看另一个比方!

不过有一个领域跟着时间的推移发生了很大的改动,那就是 Anappstoredroid 的奉告 API。曾经有一段时间,每一次 Google I/O 大会都会宣布一个新的 API 方面的改安全教育途径动。

好在咱们有 NotificationManagerCmarkdownpadompat 来抢救咱们!!!

比方说当我APP们需求获取奉告通道组(NotificationChannelGroup)的时分:

val groups = notificationManagerCompat.notificationChanmarkdown是什么意思nelGroups

咱们不需求担忧通道组是否被google翻译全部markdown语法操作系统版别支撑,由安全教育日是哪一天于它实践上会被在 Compat 类中处理掉:

public List<NotificationChannelGroup> getNotificationChannelGroups() {
if (Build.VERS安全教育途径登录ION.SDK_INT >google空间= 26) {
returapp装置下载n mNotificationManage安全期r.安全教育日getNotificatmarkdown编辑器imarkdown数学公式onChanappreciatenelGrgithuboups()
}
return Collections.emptyList()
}

假定咱们是在 API 26 之前,咱们只安全期会得到一个空的列表,假定不是咱们就会得到在 API 26 中引appear进的新通道组。

你能够在 NotificationManagerComgooglepat 代码处找到更杂乱markdown软件的查看。

但假定你仔细观察,NotificationManagerCompat 会回来我googleplay们实践的 API 类。在上面的示例安全教育途径登录代码中列出了 NotificationChannelGroup,这并不是一个拷贝的 Compat 版别,不过因为它查看了 API 的可用性,咱们能够安全运用它。

val groups = notificationManagerCompat.notificationChannelGroups
val channelgit命令s = grmarkdown软件oups.flatMap {
it.channels.filter { it.shouldShowLights() }
}

这儿咱们只安全教育途径登录入口需求那些正在触发灯火的途径组,也就是 APIgoogleplay 26 及以上github永久回家地址。因为咱们运用的是比github中文官网网页最低 SDK 等级更高的 API 等级的类,编译markdown教程器会在这儿正告app装置下载咱们:

当 Android 的 Compat 库不能解救你的时分

编译器并不介怀咱们运用 NotificationManagerCom安全pat 来到达意图。

咱们有多种办法安全期计算器来处理这个问题。

当 Android 的 Compat 库不能解救你的时分

RequiresApi 注解增加到咱们的办法中并没有什么含义,因为咱们会简略地将正告移到调用函数中markdown编辑器。用查看围住如同现已过期了,因为这个查看现已由 NotificationManagerCompat 完毕,如上图所示。

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

@SuppressLingoogle浏览器t("NewApi")
private fun checkChannels() {
val groups = notifiappointmentcationManagerCompat.notificationChanne安全教育日是哪一天lGroups
val channels = groups.flatMap {
it.channels.googlefilter { it.shouldShowLights() }
}
...
}

新的需求即将到来

假定咱们得到了额外的要求,我安全期是哪几天们需appointment求过滤掉被屏蔽的组。咱们能够为此增加一个简略github中文官网网页的查看:

@SuppressLint("NewApi")
private fun checkChannels() {
val groups = notificationManager.notificationChannelGroups
v安全期计算器al channels =application groups.filterNot { it.isBlocked }.fAPPlatMap {
it.channels.fgoogle空间ilter { it.shouldShowLights()}
}
...
}

全部看起来都很好,对吗?

你完了!

但咱们刚刚引入了一个溃散!

原因是:isBlocked 是在 API 28 才引入的,而咱们没有进行检Markdown查! 尽管咱们运用了 NotificationManagerCompat,但咱们仍是遇到了 API 等级上的问题!

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

所以当涉及到抑制正告的时分,咱们就应该更加审慎!

处理计划?

因为只需在办法等级上才调处理这个问题(不适用单个语句),最好的办法是编写能满足咱们需求的单行的办法。

多亏了扩展函数,这能够十分容易地完毕:

@SuppressLint("NewApi") // SDK 26
fun NotificationChannelGroup.lightingChannels() =
channels.filtgoogle翻译erLightingOnes()
@SuppressLint("Ngiti是什么牌子ewApi") // SDK 26
private fun List<NotificationChannel>.filterLightingOnes() =
filter { it.appearshouldShowLights() }

假定咱们在上面的比方中运用这种办法,咱们在添google谷歌搜索主页isBlocked 的时分就会得到正告:

当 Android 的 Compat 库不能解救你的时分

当然,这关于咱们开发者来googleplay安卓版下载说多了许多作业,可是咱们的用户会很喜欢一个无溃散的使用。

The LintGoogleer

giti轮胎述比方不是 Compat 库的 Bug,而是被抑制躲藏了。这种情况也可能发生在许多其他 API 上。

  • 不要掉进这个圈套!
  • 运用 Coappstorempat 库可能会给咱们带来Git虚伪的markdown格式安全感,并欺骗咱们信任咱们不用考虑这些问题。

而且再次强markdown中文官网调,尽markdownpad避免抑制 NewApi 正告

相反,咱们应该运用直安全教育日是哪一天接的版别查看,比方:

if (Build.VERSION.SDKgoogle_INT >= Bgithubugiti轮胎是什么品牌ild.VERSION_CODES.P)

不幸的是,lint 在安全期是哪几天这儿不是很智能。它不会了解一些变型的安全版别查看,比方说:

.filtmarkdownpader { Build.VERSION.SDK_INappointmentT >= Build.VERSION_Cgiti轮胎是什么品牌ODES.P }

求助?

或许你们中的一些人想更多地研讨这个,用一些自定义的 lint 规矩。基本上,咱们需求这样的东西:

@CheckedUpTo(Build.VERSION_CODEmarkdown数学公式S.P)

这将在内部完毕类似于 SuppressLint("NewApi")github中文官网网页 的作业,但只会针对不需求高于 P 版其他 API 调用。

现在,你能够让现有的 lint 功用为你Git作业。例如也能够在你自己的代码中增加 @RequiresApi(Build.VERSION_CODES.P),强制让你处理这些问题。

记住,这些注释也被认为是你的代码读者的文档。

PS: 最新的 NotificationCompat alpha 版别将为咱们带来 NotificationChannelNotificationChannelGroup 的兼容版别。

假定发现译markdown是什么意思文存在过错或其他需求改进的当地,欢迎到 翻译计划 对译文进行修改并 PR,也可获markdown软件得相应奖励积分。文章开始的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链markdown语法接。


翻译计划 是一个翻译优质互联网技术文章安全期的社区,文章来markdown软件历为 上的英文同享文章。内容掩盖 Android、iOS、前端、后端、区块链、产品、规划、人工智能等领域,想要查看更多优质译文请持续注重 翻译计划、官方微博、知乎专栏。