ChatGPT解决这个技术问题 Extra ChatGPT

RequiresApi vs TargetApi android注解

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


A
Abhay

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

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


s
ssynhtn

我首先假设您的最低 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 以满足调用该方法时崩溃。


我真的发现它比此页面上的其他答案更全面且易于理解。因此+1。
这是解释理论+实践的唯一答案,它确实应该被接受。
@RequiresApi 会在较低版本上崩溃吗?我认为在这个注释下,一个方法应该只在给定的 API 级别或更高级别上调用。
@BitwiseDEVS 是的,它“应该”在给定的 api 级别或更高级别上调用,但是如果您在不检查设备 api 级别的情况下调用该方法,代码仍然可以编译,我假设因为我们在运行时针对“compileSdkVersion”进行编译较低的api级别设备,它会崩溃,因为在旧版本的android中没有这样的api
@ssynhtn 这确实是一个决定性的注释。另一个大问题是何时将其应用于覆盖方法。
C
Community

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

表示只应在给定的 API 级别或更高级别上调用带注释的元素。这与旧的@TargetApi 注释的目的相似,但更清楚地表示这是对调用者的要求,而不是用于“抑制”方法中超过 minSdkVersion 的警告。

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

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


M
Mike Laren

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

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

我想它们在功能上是等效的,但 @RequiresApi 似乎更新并且有更高的机会被扩展以包含更多功能。


@Penn 关心解释为什么这是错误的?
c
callmejeevan

它们都用于处理添加到新的 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 用红色为方法调用加上下划线,整个类也包含错误。
@CoolMind 你在任何方法中使用过“@RequiresApi”吗?
不,我在方法之前添加了它,例如 @TargetApi
@CoolMind 尝试对您调用的方法使用“@RequiresApi”。或者像这样包围电话。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.*api_code*) { // 你的方法名 }
是的,if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 有效,但我已经在方法中使用了它。谢谢!