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

标签 android reflection

我为什么要像讨论的那样费心使用反射 here ,是否可以简单地从 Build.VERSION.SDK_INT 测试 Android 版本并有条件地运行低 API 版本不可用的功能?

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

谢谢

最佳答案

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

关于android - 使用 Java 反射与检查 Build.VERSION.SDK_INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683777/

相关文章:

android - 将位图(RGB_565)转换为灰度(8 位)Android

python - 如何列出模块中的所有功能?

java - 如何通过反射获取函数对象的类型参数?

java.lang.NoSuchMethodException 其中 getDeclaredMethods() 显示其他情况

reflection - 不能在用反射制作的 slice 上使用范围,然后传递 json.Unmarshal

android - 如何将数据发送到wifi打印机

java - 我如何执行多个 firebase 上传并等待集体结果

Android 构建错误 : unknown package filter

android - 点击时隐藏导航栏、状态栏和工具栏

vba - 从字符串中动态选择类