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

bry*_*bam 7 java android android-1.5-cupcake

是否有一行简单的代码只允许在OS版本满足要求时加载代码?

让我说我的目标操作系统为2.2,但是对于Android 1.5,min 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}
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 11

是的,你可以这样做.事实上,有不止一种方式.(注意:此答案中唯一的Android特定部分是您找到平台版本的方式.)

假设该类在2.0版本之前X有方法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);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是为您的应用程序创建版本兼容性适配器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);
Run Code Online (Sandbox Code Playgroud)

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

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

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


有关此问题的其他"需要",请阅读Android博客上的以下文章: