我正在重新开始开发我不久前开发的应用程序,当时我的一切都是围绕 Android 2.2 Froyo 构建的。
我为最新的 API 更新了我的 SDK,并注意到我使用的 ClipboardManager 功能已被弃用。我更新了代码以使用较新的 ClipData 模型并在我的 Froyo 手机上进行了试用,当然,我在新代码中得到了 NoClassDefFoundError。
我环顾了 SO,但没有找到任何关于保持向后兼容性的一般策略的真正讨论。
我不完全确定应该如何处理这种情况以及 API 不同的其他情况,因为我希望所有版本的用户都能使用我的应用。
我应该做如下检查吗?
if(version == old){
use old API;
} else {
use new API;
}
如果是这样,我已经在我的类(class)中弃用了代码,Eclipse 将永远在那里发出警告。
另一方面,我可以针对旧版本的 API 进行构建,并希望新版本能够正常处理它。但是,当有更好的替代方案可用时,我冒着构建错误或低性能代码的风险。
解决这个问题的最佳方法是什么?
最佳答案
您可以这样做(检查 API 版本)。
您也可以使用反射来调用较新的类。
我不会担心使用不推荐使用的方法,因为所有 Android 版本都向后兼容,说你想看看 3.0 Honeycomb 的情况,因为它们有点不同。
这里是如何使用反射的解释:(是的,它以前在 SO 上,所以也许搜索反射)
http://www.youtube.com/watch?v=zNmohaZYvPw&feature=player_detailpage#t=2087s
我正在考虑使该项目可用,但在此之前这里有一些代码:
(您可以在扩展应用程序的类中执行此操作,即一次性设置)
public static Method getExternalFilesDir;
static {
try {
Class<?> partypes[] = new Class[1];
partypes[0] = String.class;
getExternalFilesDir = Context.class.getMethod("getExternalFilesDir", partypes);
} catch (NoSuchMethodException e) {
Log.e(TAG, "getExternalFilesDir isn't available in this devices api");
}
}
现在 getExternalFilesDir()仅在 API 级别 8 或更高版本上可用,所以如果他们有 (Froyo),我想使用它,否则我需要另一种方法。
现在我已经测试了我可以继续尝试使用它的方法:
if(ClassThatExtendsApplication.getExternalFilesDir != null){
Object arglist[] = new Object[1];
arglist[0] = null;
File path = (File) ClassThatExtendsApplication.getExternalFilesDir.invoke(context, arglist);
// etc etc
} else {
// Not available do something else (like your deprecated methods / or load a different class / or notify they should get a newer version of Android to enhance your app ;-))
}
希望能帮助并缩短很多谷歌搜索:-)
附:如果在 else 中您仍想使用已弃用的方法,只需在其上方添加 @SuppressWarnings("deprecation")
注释,这将消除警告,并且您出于正确的原因这样做了因为您尽可能使用最新的 API。
关于android - 如何处理 Android 中已弃用的类以保持兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321649/