2011-10-07 84 views
2

为什么要我招谁惹使用反射所讨论here,如果我可以简单地从Build.VERSION.SDK_INT测试Android版和更低版本的API无法有条件地运行的功能呢?使用Java反射VS检查Build.VERSION.SDK_INT

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

感谢

+0

如果通过“一些蜂窝码”的意思是“我创建一个包含蜂窝代码的类和调用的方法/做的东西”你的方法应该工作 - 否则你的应用程序将只是一个异常崩溃,当您尝试加载的东西的代码,是不是蜂窝(或更高版本) – Jens

+0

我的意思是比如调用View.setSystemUiVisibility这是自API实现11 –

回答

0

一个较旧的Android系统上运行时,如果隐藏在“//一些蜂窝代码”的代码你的建议将不会进行工作(无反射)使用类或方法的名称,只有在存在蜂窝API。问题的根源在于所有从代码引用的类都在加载类时加载。您需要使用反射来延迟包含Honeycomb引用的代码的解析直到运行时。

特别是,如果你有一个类:

class MyUseOfFeatures { 
    public void doSomething() { 
     if (TestIfPhoneHasFancyHoneycombFeature()) { 
      Object example = android.util.JsonReader(); // JsonReader is new in 3.0 
     } 
} 

然后当JVM(?呃,DVM)加载字节码该类它会尝试解决这个android.util.JsonReader名上课的时候被加载(大概当你的应用程序被加载)。

如果仅仅依靠蜂窝的一些行为(没有任何任何新的类,方法或字段),那么你会被罚款,只是测试版本号。

+0

当我写的,上面的代码工作正常的API 8和API 13.所以我不看不到你提到的问题。 –

+0

您在代码中引用了哪些Honeycomb API或功能? –

+0

我在问题中添加了示例。 –