我为什么要像讨论的那样费心使用反射 here ,是否可以简单地从 Build.VERSION.SDK_INT 测试 Android 版本并有条件地运行低 API 版本不可用的功能?
那个article讨论了如何获取方法ID,处理异常等,这似乎比简单使用更复杂:
if(Build.VERSION.SDK_INT>=11){
// some Honeycomb code
// example: findViewById(R.id.root).setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
}
此代码适用于各种设备(2.2/3.2/等)。
谢谢
最佳答案
如果隐藏在“//some Honeycomb code”中的代码使用仅存在于 Honeycomb API 中的类或方法名称,则在较旧的 Android 系统上运行时,您的建议将无法工作(没有反射)。问题的根源是在加载类时加载了代码中引用的所有类。您需要使用反射将包含 Honeycomb 引用的代码的解析延迟到运行时。
具体来说,如果你有一个类:
class MyUseOfFeatures {
public void doSomething() {
if (TestIfPhoneHasFancyHoneycombFeature()) {
Object example = android.util.JsonReader(); // JsonReader is new in 3.0
}
}
然后,当 JVM(呃,DVM?)加载此类的字节码时,它将尝试在加载类时(大概是在加载应用程序时)解析 android.util.JsonReader 名称。
如果您只依赖于 Honeycomb 的某些行为(而不是任何新的类、方法或字段),那么您只需测试内部版本号就可以了。
关于android - 使用 Java 反射与检查 Build.VERSION.SDK_INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683777/