【问题标题】:Is @TargetApi annotation just for one Api level or above?@TargetApi 注释是否仅适用于一个 Api 级别或更高级别?
【发布时间】:2016-08-17 23:13:25
【问题描述】:

我在我的应用程序中使用@TargetApi(23)。

@TargetApi(23)
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        onAttachToContext(context);
    }


    @SuppressWarnings("deprecation")
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            onAttachToContext(activity);
        }
    }

    protected void onAttachToContext(Context context) {

    }

但我无法理解:@TargetApi(23) 注释的意思是“仅适用于 Api 级别 23”或“适用于 Api 级别 23 及以上”?比如设备24的Api级别,是否调用了onAttach(Context context)方法?

【问题讨论】:

  • @TargetApi(23) 表示“我,作为这个方法的作者,将确保它永远不会在 API 级别 24 或更高级别上被调用。但是,我已经对其进行了测试,并认为它适用于 API 23级及以下,即使我的minSdkVersion低于23级。”您对@TargetApi 的使用对Android 本身以及该方法是否被调用都没有影响。它只是告诉构建工具停止抱怨您认为自己处理正确的问题。
  • @CommonsWare 这不是完全错误的方式吗?
  • @CommonsWare @TargetApi(23) 不意味着您保证永远不会在 API 级别 22 或更低级别(而不是 24 或更高级别)上调用它吗?
  • 啊,是的,对不起,你是对的,我的评论是错误的。抱歉!
  • @kuhr:评论只能编辑 5 分钟,而更正来得太晚了近三年。我把原来的评论留在那里,所以其余的 cmets 是有意义的。而且,如果您的 :) 意味着您知道所有这些,我为堆栈解释道歉! (或者那是溢出?)

标签: android


【解决方案1】:

TargetApi 注释仅用于 lint 工具的目的,在运行时没有结果。如果您在您的方法中使用任何仅在 23 上可用的 API 方法并且不声明 TargetApi,您只会收到一些警告,表明您使用的 API 在您的最低 SDK 版本中不可用。您有责任以连贯性的方式调用此方法,并了解调用它的 API 级别。

【讨论】:

  • 因此,如果我在 API 13 系统上运行 @TargetApi(26) 的方法,什么都不会简单地崩溃,对吧? (只要我有条件地执行某些需要更高 API 的语句)
【解决方案2】:

@TargetApi 不会阻止任何代码运行, 它所做的只是消除 lint 错误。

你仍然需要添加一些类似的东西

if (Build.VERSION.SDK_INT > 7){
    //...
}

【讨论】:

    【解决方案3】:
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        //to do something
    }else{
        //to do something else
    }
    

    我升级了@Yang 的回答。

    【讨论】:

      【解决方案4】:

      你也可以使用

      @RequiresApi(Build.VERSION_CODES.N)
      

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

      【讨论】:

        【解决方案5】:

        在@Fivos 回答的基础上,添加@RequiresApi 还意味着将出现构建/编译错误,表明您正在调用仅存在于高于您指定的最小目标的目标上的方法/功能。

        Function using @requiresapi

        Compilation error after adding requires

        【讨论】:

          猜你喜欢
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-08
          • 1970-01-01
          • 2016-11-30
          • 1970-01-01
          相关资源
          最近更新 更多