使用Java反射与检查Build.VERSION.SDK_INT

时间:2011-10-07 06:32:40

标签: android reflection

如果我可以简单地从Build.VERSION.SDK_INT测试Android版本并有条件地运行在较低API版本上不可用的函数,为什么我要使用所讨论here的反射呢?

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 /等)。

由于

1 个答案:

答案 0 :(得分:0)

如果隐藏在“// 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的某些行为(不是任何新的类,方法或字段),那么您可以只测试内部版本号。