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...
@RequiresApi
- 表示只能在给定的 API 级别或更高级别上调用带注释的元素。
@TargetApi
- 指示 Lint 应该将此类型视为针对给定的 API 级别,无论项目目标是什么。
我首先假设您的最低 api 版本低于您要调用的 api,因为这就是此类注释的意义
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}
当一个方法用此注释时,每当您调用该方法时,您都会收到一个漂亮的红色警告,表明此调用需要高于您的最低 api 版本的 api 版本,但这并不会阻止您编译和构建您的 apk,当我测试它时,它只会在较低版本的 Android 上崩溃。
@TargetApi
这根本没有帮助,它会抑制在你的方法中调用新的 api 的警告,但是当你从其他地方调用这个方法时,根本没有 lint 警告,你仍然可以构建和安装你的 apk 只是为了满足调用该方法时会发生崩溃。
与 Mike 所说类似,您可以在文档中看到:
表示带注释的元素只能在给定的 API 级别或更高级别上调用。
这与旧的 @TargetApi 注释的目的类似,但更清楚地表达这是对调用者的要求,而不是用于“抑制”方法内超出 minSdkVersion 的警告。
正如您在这里所看到的,这实际上是强制调用者验证调用此方法时使用的 API,而不是仅仅从 IDE/LINT 中删除警告。
您可以将其与 @NonNull 或 @Null 注释进行比较,它们强制调用者可以/不能将空值发送到函数中。
来自 https://developer.android.com/reference/android/support/annotation/RequiresApi.html中的 JavaDocs:
[@RequiresApi] 这与旧的 @TargetApi 注释的目的类似,但更清楚地表达这是对调用者的要求,而不是用于“抑制”方法内超出 minSdkVersion 的警告。
我认为它们在功能上是等效的,但
@RequiresApi
似乎更新,并且有更高的机会进行扩展以包含更多功能。
两者都是为了处理添加到新的 Android API 级别的功能,而不影响其他 API 级别。
需要Api
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
这里表示带注释的元素只能在给定的 API 级别或更高级别上调用。低于给定 API 级别的带注释元素将不会调用。
目标API
@TargetApi(Build.VERSION_CODES.*api_code*)
指示 Lint 应该将此类型视为针对给定的 API 级别,无论项目目标是什么。仅适用于指定的 API 级别。 不会在其他 API 级别上调用。