【问题标题】:RequiresApi vs TargetApi android annotationsRequiresApi vs TargetApi android注解
【发布时间】:2016-10-12 20:02:50
【问题描述】:

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

【问题讨论】:

    标签: android android-support-library kotlin android-annotations


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我首先假设您的最低 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 这确实是一个决定性的注释。另一个大问题是当它被应用于覆盖一个方法时。
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • @Penn 关心解释为什么这是错误的?
        【解决方案5】:

        它们都用于处理添加到新的 android API 级别的功能,而不影响其他 API 级别。

        需要Api

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

        这里说被注释的元素只能在给定的 API 级别或更高级别上调用。给定 API 级别以下的注释元素不会调用。

        TargetApi

        @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) { 有效,但我已经在方法中使用了它。谢谢!
        猜你喜欢
        • 2019-04-11
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 2021-01-31
        • 1970-01-01
        相关资源
        最近更新 更多