RequiresApi
和TargetApi
之间的区别是什么?
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...
答案 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级别。