RequiresApi vs TargetApi android注释

时间:2016-10-12 20:02:51

标签: android android-support-library kotlin android-annotations

RequiresApiTargetApi之间的区别是什么?

kotlin中的样本:

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

注意:FingerprintManager.AuthenticationCallback需要api M

注意2:如果我不使用TargetApi lint失败并出现错误class requires api level 23...

5 个答案:

答案 0 :(得分:57)

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

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

答案 1 :(得分:34)

与Mike所说的相似,正如您在文档中看到的那样:

  

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

     

这与旧版@TargetApi注释的目的相似,但更清楚地表明这是对调用者的要求,而不是习惯于"抑制"方法中超过minSdkVersion的警告。

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

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

答案 2 :(得分:22)

来自https://developer.android.com/reference/android/support/annotation/RequiresApi.html中的JavaDocs:

  

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

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

答案 3 :(得分:18)

我首先假设你的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的警告,但是当你从其他地方调用这个方法时,根本没有lint警告,你仍然可以只构建和安装你的apk在调用该方法时遇到崩溃。

答案 4 :(得分:5)

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

<强> RequiresApi

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

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

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

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