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



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

那篇文章讨论了如何获取方法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名称(大概是在加载应用程序时)。

如果你只依赖蜂窝的一些行为(没有任何新的类,方法或字段),那么你只测试构建号就可以了。

相关内容

  • 没有找到相关文章

最新更新