是否有一行简单的代码只允许在操作系统版本满足要求时加载代码?
让我说我的目标操作系统为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}
答案 0 :(得分: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博客上的以下文章:
答案 1 :(得分:2)
这是另一个没有反射的例子 http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以查看Build.VERSION.RELEASE
,它会为您提供当前版本的Android系统(1.5,1.6,2.1,2.2)