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 级别上调用。
@RequiresApi
时,AS 用红色为方法调用加上下划线,整个类也包含错误。
@TargetApi
。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
有效,但我已经在方法中使用了它。谢谢!
不定期副业成功案例分享
@RequiresApi
会在较低版本上崩溃吗?我认为在这个注释下,一个方法应该只在给定的 API 级别或更高级别上调用。