android - 如何处理 Android 中已弃用的类以保持兼容性

标签 android compatibility deprecated backwards-compatibility

我正在重新开始开发我不久前开发的应用程序,当时我的一切都是围绕 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/

相关文章:

java - Neo4j 应该使用哪个遍历?

installation - 由于已弃用的核心音频功能,端口音频将无法安装

android - 如何限制谷歌地图缩放

android - 如何在JQMobile中将列表背景设置为透明?

android - 4.4以下沉浸式全屏

ruby - Sass 编码::兼容性错误

wpf - Silverlight 中 System.Drawing.Bitmap 的替代方案,与 WPF 兼容

.net - Windows XP 支持的最高 .NET 版本

android - 实体商品的应用内购买 - 禁止或不推荐?

c - 访问冲突读取位置 0x73726573