@TargetApi注解只针对一个API级别或更高级别吗?

34

我在我的应用程序中使用@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 及以上"?例如,如果设备的 API 级别为 24,那么 onAttach(Context context) 方法会被调用吗?


12
@TargetApi(23) 的意思是“我作为这个方法的作者,将确保它不会在API级别24或更高版本上被调用。但是,我已经测试过,并且觉得它在API级别23及以下工作正常,尽管我的minSdkVersion小于23。”你对@TargetApi的使用不会影响Android本身以及方法是否被调用。它只是告诉构建工具停止抱怨你认为自己已经正确处理的问题。 - CommonsWare
3
@CommonsWare 这不是完全相反的方式吗? - Liminal
10
@CommonsWare 不是意味着 @TargetApi(23) 确保它不会在 API 级别 22 或更低的版本上调用,而不是 24 或更高的版本吗? - Liminal
1
啊,是的,抱歉,你是正确的,我那个注释写错了。真是对不起! - CommonsWare
2
@kuhr:评论只能在5分钟内编辑,而这次更正来得太晚了,差不多已经过去三年了。我把原始评论留在那里,这样其他评论就有意义了。如果你的 :) 意味着你已经知道了所有这些,那么我为解释过度道歉!(或者是溢出解释?) - CommonsWare
显示剩余3条评论
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
31

TargetApi注解仅用于lint工具,不会在运行时产生任何结果。如果您在方法中使用了只能在API 23及以上版本中使用的API方法,但没有声明TargetApi,将会收到一些警告,提示您正在使用不适用于最低SDK版本的API。使用该方法时,您需要意识到它将被调用的API级别,并相应地进行调用。


1
那么,如果我在 API 13 的系统上运行一个 @TargetApi(26) 方法,只要我仅有条件地执行需要更高 API 的特定语句,就不会出现崩溃的情况,对吗? - Sreenikethan I

8

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

你仍然需要添加一些类似于以下内容的代码:

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

0
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
    //to do something
}else{
    //to do something else
}

我升级了@Yang的答案。


0

0

你也可以使用

@RequiresApi(Build.VERSION_CODES.N)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,