可以根据Android操作系统版本仅加载特定行的代码吗?

2023-11-22

是否有一行简单的代码允许仅在操作系统版本满足要求时加载代码?

假设我的目标操作系统是 2.2,但 android 1.5 的最小 sdk 是 3,所以即使我的项目中有一些与 1.5 不兼容的代码,它仍然会编译,因为目标操作系统是 2.2。无论如何,我想广告一个功能,该功能需要 1.5 SDK 中没有的代码,并且如果在 1.5 手机上加载该代码会导致崩溃。我能做这样简单的事情吗?所以我不必让整个应用程序对 1.5 用户不可用?

 if (Android OS == >2.1){
            //Insert code here that requires 2.1 and up}
        else{
            //insert code that would appear is OS is <2.1}

是的,你可以这么做。事实上,方法不止一种。 (注意:此答案中唯一针对 Android 的部分是查找平台版本的方式。)

假设那个班级X有方法void y()从 2.0 版本开始,但之前没有。

在不引入任何编译时依赖项的情况下调用此方法的一种方法是使用反射来定位方法并调用invoke在上面。例如:

X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
    // (exception handling omitted ...)
    Method m = c.getClass().getDeclaredMethod("y");
    m.invoke(x);
}

另一种方法是为您的应用程序创建版本兼容性适配器 API,如下所示:

/** Version compatibility adapter API */
interface Compat {
    void doY();
}

/** Adapter class for version 1 */
class CompatV1 {
    public void y(X x) {
       // do nothing
    }
}

/** Adapter class for version 2 */
class CompatV2 {
    public void y(X x) {
       x.y();
    }
}

// 
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
    compatClass = Class.forName("...CompatV1");
} else {
    compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();

// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.

// Invoke X.y() as follows:

X x = ...
compat.y(x);

第二个版本看起来有点重量级,但它的优点是动态(缓慢、非类型安全)代码仅执行一次,并且版本特定代码与其余代码隔离。在现实生活中,您可能会将许多方法放入适配器接口中。

这种方法需要更多的思考,以弄清楚如何设计兼容性 API,以便将版本依赖性与其余代码完全隔离。您可能还需要修改适配器 API,并为每个新的(不兼容的)主要版本创建新的适配器类。

最后,如果平台 API 发生变化,您需要适应需要使用旧版本中的类或方法removed在较新的版本中,那么您将需要编译各种适配器类(例如CompatV*类)使用不同的 Android SDK。这将使您的构建过程变得更加复杂。


有关此问题的其他“观点”,请阅读 Android 博客上的以下文章:

  • Android 应用程序的向后兼容性
  • 如何拥有并享用你的(杯形)蛋糕.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以根据Android操作系统版本仅加载特定行的代码吗? 的相关文章

  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • Android:如何创建模态进度“轮”叠加层?

    我想在我的视图上显示模式进度 轮子 叠加层 ProgressDialog 很接近 但我不想要对话框背景或边框 我尝试设置对话框窗口的背景可绘制 this progressDialog new ProgressDialog Main this
  • 为什么 Google 建议将库复制到您的树中?

    谷歌的Play 服务 API 的使用说明 http developer android com google play services setup html 例如 说 将 extras google google play service
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • Android TextureView 和硬件加速

    我正在尝试实现上所示的示例这一页 http developer android com reference android view TextureView html 我已经在运行 android 4 及以上版本的三种不同设备上进行了尝试
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Activity 暂停时调用 FragmentManager.popBackStack 是否安全

    的文档FragmentManager popBackStack https developer android com reference android app FragmentManager html popBackStack java
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • WPF中如何直接在位图(BitmapSource、WriteableBitmap)上绘图?

    在 GDI Winforms 中我会这样做 Bitmap b new Bitmap 32 32 Graphics g Graphics FromImage b some graphics code 如何使用 DrawingContext 在
  • 如果构造函数参数与 C++ 中的成员变量同名怎么办?

    首先是一些代码 class CInner public CInner const CInner another impl here private some member variables class COuter public COut
  • 大写 Unicode 的正则表达式与“Ó”不匹配?

    它似乎不将重音 识别为大写 usr bin env perl use strict use warnings use 5 14 0 use utf8 use feature unicode strings SIM N s p Upper u
  • VS2010命令提示符给出错误:无法确定 VS Common Tools 文件夹的位置

    我已经安装了VS2010 安装创建了 VS2010 命令提示符的快捷方式 但是当我打开命令提示符时出现错误 无法确定 VS Common Tools 文件夹的位置 我检查了环境变量 VS100COMNTOOLS 它有值 C Program
  • 我应该提交由 Eclipse 更改的文件吗?

    我以Eclipse项目的形式继承了一个Java项目 更改 Tomcat 配置 从 v6 到 v7 后 Subclipse 提示我提交以下文件 classpath org eclipse core prefs org eclipse comm
  • 为什么 Silverlight TextBox 使用 \r 作为换行符而不是 Environment.Newline (\r\n)?

    在 silverlight 中 如果 TextBox AcceptsReturn 则所有换行符均为 r 即使 Environment Newline 为 r n 为什么是这样 WPF 将 r n 作为文本框的换行符 我同意尔坦的回答 我遇到
  • 解码 Base64 图像

    我在 HTML 中嵌入了 Base64 图像 如何使用 C 或 VB net 对其进行解码 google com gt base64 图像解码 C gt http www eggheadcafe com community aspnet 2
  • 启用位置/GPS 设置而不使用 Play 服务 API

    大多数人可能已经知道 Google Play 服务中有一个新的位置设置对话框 API 对于那些不知道的人 这里是使用 Dialog API 的地图应用程序的屏幕截图 谷歌只在他们的播放服务中添加该 API 这有点不公平 另一方面 我认为如果
  • 仅静态链接某些库

    在与 GCC 链接时 如何将某些特定库静态链接到我的二进制文件 gcc static 尝试静态链接all链接库 但我还没有其中一些的静态版本 例如 libX11 gcc lsome dynamic lib code c some stati
  • CrossGeolocator 的 GetPositionAsync 不起作用

    我在用交叉地理定位器检索设备的当前纬度和经度 不过我在里面使用它出现时覆盖方法 但它不起作用 这异步获取位置方法挂起应用程序 protected override void OnAppearing base OnAppearing var
  • jQuery:如何更改标签名称?

    jQuery 如何更改标签名称 例如 tr 1 tr I need div 1 div 我可以 创建 DOM 元素 将tr内容复制到div 从 dom 中删除 tr 但我可以直接做吗 PS tr get 0 tagName div 结果是D
  • Liquibase Hibernate 插件不起作用

    如此处所述 https github com liquibase liquibase hibernate issues 74 我在使 liquibase hibernate 扩展正常工作时遇到问题 我想我已经设置好了一切 但似乎我一直遇到奇
  • Spring - mongodb - 聚合 - 需要“光标”选项

    执行以下聚合管道 public void getMostLikedItems UnwindOperation unwind Aggregation unwind favoriteItems GroupOperation group Aggr
  • 仅生成 8 个字符的 UUID

    UUID 库生成 32 个字符的 UUID 我想生成仅 8 个字符的 UUID 可以吗 这是不可能的 因为 UUID 每个定义都是 16 字节的数字 当然 您可以生成 8 个字符长的唯一字符串 请参阅其他答案 另外 生成较长的 UUID 并
  • 将文件从操作系统拖放到 Java 应用程序 (Swing)

    首先我要说的是我一直在阅读拖放教程以及类似的问题 但不幸的是我对这件事变得更加困惑 我想要实现的目标相对简单 所以我很惊讶它已经给我带来了这么多麻烦 我正在编写一个小型实用程序应用程序 它将把一堆结果文件 自定义定义的 xml 类型 合并到
  • 未找到“COM”类

    我一直在尝试在脚本中打开 Word 文档 但收到相同的错误 Fatal error Class COM not found in Applications XAMPP xamppfiles htdocs php on line 3 我的代码
  • 如何在 NodeJS 中创建带有路径的文件对象?

    我想知道是否可以创建一个FileNodeJS 中的对象 名称 大小 数据 以及现有文件的路径 我知道客户端可能有这种情况 但我没有看到 NodeJS 的任何内容 换句话说 我想要与 NodeJS 中相同的函数 function srcToF
  • CompositeCollection 内的绑定

    我想创建一个包含多个 静态 TabItem 在 XAML 中显式键入 和多个动态添加的 TabItem 的 TabControl 为了实现这一点 我尝试使用 CompositeCollection 作为 TabControl ItemSou
  • fft(DFT) x 轴的单位[重复]

    这个问题在这里已经有答案了 可能的重复 如何从 FFT 结果获取频率 我对 Matlab 中 fft DFT 命令的 x 轴感到困惑 当我们对在 n 点采样的信号执行 fft 命令时 我们会得到一个 x 轴为 0 到 n 1 的图 它的意思
  • 可以根据Android操作系统版本仅加载特定行的代码吗?

    是否有一行简单的代码允许仅在操作系统版本满足要求时加载代码 假设我的目标操作系统是 2 2 但 android 1 5 的最小 sdk 是 3 所以即使我的项目中有一些与 1 5 不兼容的代码 它仍然会编译 因为目标操作系统是 2 2 无论