RequiresApi与TargetApi android注释
RequiresApi与TargetApi android注释,android,android-support-library,kotlin,android-annotations,Android,Android Support Library,Kotlin,Android Annotations,RequiresApi和TargetApi之间有什么区别 科特林的样本: @RequiresApi(api = Build.VERSION_CODES.M) @TargetApi(Build.VERSION_CODES.M) class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback() 注意:FingerprintManager.AuthenticationCallback需要apiM 注2:如果我不使用Ta
RequiresApi
和TargetApi
之间有什么区别
科特林的样本:
@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()
注意:FingerprintManager.AuthenticationCallback
需要apiM
注2:如果我不使用TargetApi lint fail with error类需要api级别23…
中的JavaDocs:
[@RequiresApi]这在目的上与旧的@TargetApi注释类似,但更明确地表示这是对调用方的要求,而不是用于在方法中“抑制”超过minSdkVersion的警告
我认为它们在功能上是等效的,但是
@RequiresApi
似乎更新了,并且有更高的机会被扩展以包含更多功能。类似于Mike所说的,正如您在文档中看到的:
表示只应在给定的API级别或更高级别上调用带注释的元素
这在目的上与旧的@TargetApi注释类似,但更明确地表示这是对调用方的要求,而不是用于“抑制”方法中超过minSdkVersion的警告
正如您在这里看到的,这实际上是强制调用方验证调用此方法时使用的API,而不是从IDE/LINT中删除警告
您可以将其与@NonNull或@Null注释进行比较,它们强制调用方可以/不能将Null值发送到函数中。
@RequiresApi
-表示只应在给定的API级别或更高级别上调用带注释的元素
@TargetApi
-指示Lint应将此类型视为针对给定的API级别,而不管项目目标是什么 它们都是用于处理添加到新android API级别的功能,而不会影响其他API级别
RequiresApi
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
在这里,它表示只应在给定的API级别或更高级别上调用带注释的元素。给定API级别下的带注释元素将不会调用
TargetApi
@TargetApi(Build.VERSION_CODES.*api_code*)
指示Lint应将此类型视为以给定的API级别为目标,而不管项目目标是什么。仅适用于指定的API级别。
不会在其他API级别调用 我首先假设您的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,它只会在我测试的安卓较低版本上崩溃
@TargetApi
这根本没有帮助,它抑制了在方法中调用新API的警告,但是当您从其他地方调用此方法时,根本没有lint警告,您仍然可以构建和安装apk,但只有在调用该方法时遇到崩溃。@Penn是否愿意解释为什么这是错误的?我确实发现它比本页上的其他答案更全面、更容易理解。因此+1。这是解释理论+实践的唯一答案,它确实应该被接受。当我使用
@RequiresApi
,在方法调用中加上红色下划线,并且整个类包含错误。@CoolMind你在任何方法中使用了“@RequiresApi”吗?不,我在方法之前添加了它,像@TargetApi
@CoolMind一样,尝试将“@RequiresApi”用于调用的方法。或者像这样环绕呼叫。如果(Build.VERSION.SDK\u INT>=Build.VERSION\u code.*api\u code*){//your method name}是的,if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
可以工作,但我已经在方法中有了它。谢谢!