2

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

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

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

总是安全的,还是在某些情况下会发生崩溃?是否有任何理由使用反射而不是使用上述版本检查来检查 Activity 中是否存在“getActionBar”方法?

4

1 回答 1

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测试应该防止这种情况发生。

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

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

于 2013-05-14T17:23:01.860 回答