2013-05-14 62 views
2

我知道有(至少)两种方式做运行时检查,以确保我的代码不会调用的API不存在:Android的向后兼容性:反射对简单的条件检查

但我不明白什么时候应该用一种技术来代替另一种技术。当试图使用Android 可能不存在,因为这样的装载在我的代码中引用的类会造成致命错误的反思似乎有必要。但是如何调用属于我知道的类的方法呢?例如,在设备上运行2.2(API 8):

protected void onCreate(Bundle savedInstanceState) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { 
     ActionBar actionBar = getActionBar(); 
    } 
... 

这是总是安全,还是有情况,其中一个崩溃会怎样呢?是否有任何理由检查活动中是否存在使用反射而不是使用上述版本检查的“getActionBar”方法?

回答

3

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

使用第一项符号技术。

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

首先,您需要更改到HONEYCOMB,为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”方法使用反射而不是使用上述版本检查?

号只需设置您的构建目标(例如,项目>属性>的Android在Eclipse),以高到足以覆盖你要引用的一切,并设置android:minSdkVersion你愿意支持水平的值。任何你尝试使用的东西比android:minSdkVersion都会被标记为Lint的错误,并且你可以添加你的Java版本守护块(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.WHATEVER))和@TargetApi()注释让林特停止抱怨。