@TargetApi 注释是不是仅适用于一个 Api 级别或更高级别?

Posted

技术标签:

【中文标题】@TargetApi 注释是不是仅适用于一个 Api 级别或更高级别?【英文标题】: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 是有意义的。而且,如果您的 :) 意味着您知道所有这些,我为堆栈解释道歉! (或者那是溢出?) 【参考方案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

【讨论】:

以上是关于@TargetApi 注释是不是仅适用于一个 Api 级别或更高级别?的主要内容,如果未能解决你的问题,请参考以下文章

获取请求仅适用于斜杠(spring REST 注释)

覆盖 Android Backbutton 行为仅适用于具有 PhoneGap 的第一页

Apache重写规则仅适用于新连接

PyAssimp 是不是仅适用于 STL 文件格式?

C++ memset 是不是仅适用于 0 和 -1? [关闭]

UIScrollView 是不是仅适用于嵌入在导航控件中的视图控制器?