0

我正在寻找一种方法,如何组合不同 SDK 版本的组件。

例如,我有一个与 minSdkVersion="8" 配合使用的 APP。但我想有一个额外的功能,需要 minSdkVersion="10"。

也许像插件之类的东西并动态加载它?如果 android 设备具有 minSdkVersion="10" 它将加载该插件。在较低版本中,它只能使用 SdkVersion="8" 的基本功能。

有什么办法吗?可以在不同的包中创建两个活动并从意图加载一个活动作为界面吗?有任何想法吗?

4

4 回答 4

2

要面向多个平台,请在构建项目时指定最低 SDK 级别和目标 SDK 级别。您将项目配置为链接到目标 SDK 构建。如果您对当前平台上不存在的方法执行调用,Davlik VM 将生成运行时异常。编译器将为在最低 SDK 级别上不可用的调用生成警告。有各种 Java @ 声明可以抑制对类、方法或特定引用的警告。在 Eclipse 中按 F2 键以自动生成适当的 Java 装饰。听起来很吓人。但在实践中,这些警告让您可以相对无所畏惧地编写代码。

所以一般的做法是:链接目标SDK库;将 @ 装饰添加到使用来自更高 SDK 版本的方法的代码中;装饰特定于特定构建的方法或类;根据“所有警告都是错误”的编码规则生死存亡。

为每个 API 级别重新实现整个活动是多余的。具有覆盖方法的类特化并不是做这种事情的好方法。绑定的复杂性使得以这种方式工作变得困难。使用较小的帮助程序类或条件代码要好得多。

编写 Helper 类有各种约定——本质上是每个 API 级别的单独实现类,每个实现一个公共接口或抽象基类。Android 开发者博客中给出的方法是一种相当整洁的方法。该模式有很多细微的变化,所有这些都基于获取特定 API 级别的帮助程序类的实例。

这种模式的另一个例子是谷歌 ActionBarCompat 库中使用的 IActionBarHelper 接口。在这种情况下,您的活动继承自 ActivityCompat,而不是 Activity,并且实例方法 ActivityCompat.getActionBarHelper() 返回 IActionBarHelper 的实现,该实现为您正在运行的平台提供适当的实现。在这种情况下,实现包含相当多的初始化状态,以及与活动相关的状态;所以从成员方法中获取实现是有意义的。

尽管如此,Davlik VM 完全能够处理没有链接的内联方法。

  if (Build.Version >= 10) { 
      Call an API 10 method.
  }

也工作得很好。Davlik VM 确实通过 LogCat 中的调试消息发出了一点点抱怨。因此,如果您一直这样做,可能会有一些开销。如果您要在下层平台上执行 API-10 方法,Davlik 加载程序会生成在执行时引发运行时异常的代码,而不是执行调用。但是代码链接和加载很好。if 语句是防止执行缺少的方法所需的全部内容。在小剂量下,条件代码是完全可以的。如果有很多特定于平台的代码,最好以某种方式将特定于平台的功能封装在一个类中。

对于存在或不存在的功能,例如您的 NFC 示例,最好的方法可能是在一个类中实现尽可能多的 NFC 功能;然后有条件地从您的主类或活动中的代码中引用该类。例如:

 void onCreate(...)
 {
    if (Build.Version >= 10) 
    {
         mNfcReceiver = new NfcReceiver(getContext());
    }
 }

Helper 类模式并不能真正帮助您,因为您显然不会在下层平台上重新实现该功能。

于 2013-01-11T14:33:54.760 回答
1

而且,如果您使用支持库?

http://developer.android.com/training/basics/fragments/support-lib.html

需要什么样的功能?

于 2013-01-11T13:06:37.907 回答
1

你的问题在Android开发者官方博客上有非常详细的解释:

http://android-developers.blogspot.co.uk/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

它基本上是应用 Java 延迟加载,这是一种编程模式,它利用了 Java 只在第一次调用时才加载一个类这一事实。

于 2013-01-11T13:48:39.377 回答
0

谢谢大家的回答。我能够在eclipse中使用@decoration解决这个问题:@SuppressLint("NewApi")。

在我的父活动中,我刚刚检查了 VERSION 和 NFC 支持并写入 this.supportNFC;之后我选择要加载的意图

if(this.supportNFC == KITAPP.NFC_ENABLED){
   intent = new Intent(this, ActivityNFC.class);
} else {
   intent = new Intent(this, ActivityBasic.class);
}
startActivityForResult(intent, 0);

顺便提一句,

class ActivityNFC extends ActivityBasic{}

所以我只是用 NFC 的附加功能扩展了我的 NFC 类。但如果移动设备不支持 NFC 或版本较低,则会加载基本功能。

于 2013-01-23T17:11:12.867 回答