如果我可以简单地从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名称(大概是在加载应用程序时)。
如果你只依赖蜂窝的一些行为(没有任何新的类,方法或字段),那么你只测试构建号就可以了。