@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 级别或更高级别?的主要内容,如果未能解决你的问题,请参考以下文章
覆盖 Android Backbutton 行为仅适用于具有 PhoneGap 的第一页