只能根据Android操作系统版本加载特定的代码行吗?
是否有一行代码只允许在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}
是的,你可以做到这一点。实际上有不止一种方式。 (注意:这个答案中唯一的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博客下面的文章:
下面是另一个例子W/O反射 http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html
带有feedburner参数的URI不适合我。博客文章位于http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html – 2011-05-12 09:46:54
除了你的答案,这里有一些样本项目展示的技术: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