RequiresApi 与 TargetApi android 注释

问题描述 投票:0回答:6

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...

android android-support-library kotlin android-annotations
6个回答
101
投票

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

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


69
投票

我首先假设您的最低 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 只是为了满足调用该方法时会发生崩溃。


38
投票

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

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

这与旧的 @TargetApi 注释的目的类似,但更清楚地表达这是对调用者的要求,而不是用于“抑制”方法内超出 minSdkVersion 的警告。

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

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


21
投票

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

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

我认为它们在功能上是等效的,但

@RequiresApi
似乎更新,并且有更高的机会进行扩展以包含更多功能。


6
投票

两者都是为了处理添加到新的 Android API 级别的功能,而不影响其他 API 级别。

需要Api

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

这里表示带注释的元素只能在给定的 API 级别或更高级别上调用。低于给定 API 级别的带注释元素将不会调用。

目标API

@TargetApi(Build.VERSION_CODES.*api_code*)

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


0
投票

@TargetApi = 谢谢Lint,我会在调用时处理它。
但是,实际上,如果我忘记在调用方进行 API 级别检查,Lint 不会打扰。 (林特满意) enter image description here

@RequiresApi = 谢谢 Lint,我将在调用端添加 API 级别检查,如果不这样做,则在下面显示一条红线。 (更好,但仍然是肤浅的运行时安全性,因为我们仍然需要进行 API 级别检查!) enter image description here

注意:一般来说,最好避免在 onCreate 等生命周期方法上使用这些注释(因为我们不这样做,但框架会调用它们),这可能会导致意外崩溃。相反,使用运行时检查来管理特定于 API 级别的代码。

© www.soinside.com 2019 - 2024. All rights reserved.