gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:12 26 4
gpt4 key购买 nike

是否有一行简单的代码,只允许在操作系统版本满足要求的情况下加载代码?

可以说我的目标操作系统是 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 类在版本 2.0 中有方法 void y(),但之前没有。

在不引入任何编译时依赖性的情况下调用此方法的一种方法是使用反射来定位方法并对其调用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);

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

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

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


对于此问题的其他“看法”,请阅读 Android 博客上的以下文章:

关于java - 可以根据 Android 操作系统版本只加载特定的代码行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com