Android向后兼容性:反射与简单条件检查

Android向后兼容性:反射与简单条件检查,android,backwards-compatibility,Android,Backwards Compatibility,我知道(至少)有两种方法可以进行运行时检查,以确保我的代码不会调用不存在的API: 使用有条件的版本号检查,laif(Build.version.SDK\u INT>=Build.version\u CODES.JELLY\u BEAN) 使用java.lang.reflect和包装类技术,如下所述: 但我不明白什么时候应该用一种技术来代替另一种。在尝试使用可能不存在的Android类时,反射似乎是必要的,因为加载代码中引用的此类类将导致致命错误。但是调用属于我知道存在的类的方法怎么样?例如

我知道(至少)有两种方法可以进行运行时检查,以确保我的代码不会调用不存在的API:

  • 使用有条件的版本号检查,la
    if(Build.version.SDK\u INT>=Build.version\u CODES.JELLY\u BEAN)

  • 使用java.lang.reflect和包装类技术,如下所述:

但我不明白什么时候应该用一种技术来代替另一种。在尝试使用可能不存在的Android类时,反射似乎是必要的,因为加载代码中引用的此类类将导致致命错误。但是调用属于我知道存在的类的方法怎么样?例如,在运行2.2(API 8)的设备上:

是否总是安全的,或者是否存在会发生碰撞的情况?是否有任何理由使用反射而不是使用上述版本检查来检查活动中是否存在“getActionBar”方法

但我不明白什么时候应该用一种技术来代替另一种

使用第一个项目符号技术

这是否总是安全的,或者是否存在发生碰撞的情况

首先,您需要将其更改为
蜂巢
,因为
ActionBar
类是在API级别11中添加的

除此之外,只要您只支持Android 2.0及更高版本,您就可以了。如果您仍然支持Android 1.x,则需要将代码重写为:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    HoneycombHelper.doSomethingCoolWithTheActionBar();
}
其中,
HoneycombHelper
是您编写的另一个类,其中包含API 11级代码(例如,
ActionBar ActionBar=getActionBar()

这种差异是因为Android 1.x上的Dalvik会很快失败,一旦您尝试加载包含无法识别引用的类,就会出现
VerifyError
。Android 2.0+不会失败,除非您实际执行包含无法识别的引用的语句,并且您的
if
测试应该可以防止这种情况

是否有任何理由使用反射而不是使用上述版本检查来检查活动中是否存在“getActionBar”方法

不需要。只需将您的构建目标(例如,Eclipse中的Project>Properties>Android)设置为足够高的值,以覆盖您想要引用的所有内容,并将您的
Android:minSdkVersion
设置为您愿意支持的级别。任何你尝试使用的比android:minSdkVersion更新的东西都会被Lint标记为错误,你可以添加Java版本的保护块(
if(Build.version.SDK\u INT>=Build.version\u CODES.WHATEVER)
)和
@TargetApi()
注释来让Lint停止抱怨

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    HoneycombHelper.doSomethingCoolWithTheActionBar();
}