2010-08-23 70 views
7

是否有一行代码只允许在OS版本满足要求时加载代码?只能根据Android操作系统版本加载特定的代码行吗?

可以说我的目标操作系统为2.2,但是最小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} 
+0

除了你的答案,这里有一些样本项目展示的技术:http://github.com/commonsguy/cw-advandroid/tree/ master/Contacts/Pick/http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare 2010-08-23 21:55:01

回答

11

是的,你可以做到这一点。实际上有不止一种方式。 (注意:这个答案中唯一的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); 

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

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

最后,如果你需要,以适应使用中的旧版本是类或方法引起这样的平台API的变化在新的版本中删除,那么你将需要编译您的各种适配器类(如CompatV*类)使用不同的Android SDK。这会让你的构建过程变得更加复杂。


对于其他 “以” 在这个问题上,阅读对Android博客下面的文章:

0

你可以用Build.VERSION.RELEASE检查,它给你的Android系统的最新版本(1.5,1.6,2.1,2.2)

有更多Build.VERSION

相关问题