如果我可以简单地从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 /等)。
由于
答案 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的某些行为(不是任何新的类,方法或字段),那么您可以只测试内部版本号。