RequiresApi vs TargetApi android批注


98

RequiresApi和之间有什么区别TargetApi

Kotlin中的样本:

@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()

注意:FingerprintManager.AuthenticationCallback需要apiM

注意2:如果我不使用TargetApi,则皮棉会因错误而失败 class requires api level 23...

Answers:


87

@RequiresApi -表示带注释的元素只能在给定的API级别或更高级别上调用。

@TargetApi -表示无论项目目标是什么,Lint都应将此类型视为针对给定的API级别。


42

我首先假设您的min api版本低于您要调用的api,因为这是这些注释的意义所在

@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}

用此方法注释方法时,无论何时调用该方法,都会收到一个红色的警告,表明此调用要求的api版本高于您的min api版本,但这不会阻止您编译和构建apk,正如我测试过的那样,它将在较低版本的android上崩溃。

@TargetApi

这一点都没有帮助,它抑制了在您的方法中调用新api的警告,但是当您从其他地方调用此方法时,根本没有皮棉警告,并且您仍然可以构建和安装apk只是为了满足调用该方法时崩溃。


2
我真的发现它比此页面上提供的其他答案更全面,更易于理解。因此+1。
阿南德·库马尔·贾

1
这是解释理论+实践的唯一答案,它确实应该被接受。
Dmitriy Pavlukhin,

37

您可以在文档中看到与Mike所说的类似:

表示仅在给定的API级别或更高级别上调用带注释的元素。

这在目的上与较旧的@TargetApi注释相似,但更清楚地表示这是调用方的要求,而不是用于在方法中“抑制”超过minSdkVersion的警告。

如您在这里看到的,这实际上是在强制调用者验证在调用此方法时使用的API,而不仅仅是从IDE / LINT中删除警告。

您可以将其与@NonNull或@Null注释进行比较,它们强制调用者可以/不能将null值发送到函数中。


21

https://developer.android.com/reference/android/support/annotation/RequiresApi.html中的JavaDoc中:

[@RequiresApi]目的类似于旧的@TargetApi注释,但更清楚地表示这是调用者的要求,而不是用于在方法中“抑制”超过minSdkVersion的警告。

我想它们在功能上是等效的,但@RequiresApi似乎是更新的,并且有更大的机会被扩展为包含更多功能。


@Penn Care解释为什么这是错误的?
hamena314 '18

6

它们都用于处理添加到新的android API级别的功能,而不会影响其他API级别。

需要Api

@RequiresApi(api = Build.VERSION_CODES.*api_code*)

这里说,带注释的元素只能在给定的API级别或更高级别上调用。给定API级别以下的带注释的元素将不会调用。

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

表示无论项目目标是什么,Lint都应将此类型视为针对给定的API级别。仅适用于指定的API级别。不会在其他API级别上调用。


当我使用时@RequiresApi,AS在红色的方法调用下划线,并且整个类都包含错误。
CoolMind

@CoolMind是否在任何方法中使用了“ @RequiresApi”?
jeevan venugopal

不,我在之前添加了它@TargetApi
CoolMind

@CoolMind尝试将“ @RequiresApi”用于您要从中调用的方法。或像这样环绕通话。如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES。* api_code *){//您的方法名称}
jeevan venugopal

是的,if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {可以,但是我已经在方法中了。谢谢!
CoolMind
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.