Android,结合不同SDK版本的应用程序组件

时间:2013-01-11 12:46:30

标签: android plugins android-intent android-activity target

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

例如,我有一个适用于minSdkVersion =“8”的APP。 但我希望有一个额外的功能,需要minSdkVersion =“10”。

也许像插件一样并动态加载它?如果Android设备有minSdkVersion =“10”,它将加载该插件。对于较低版本,它只能使用SdkVersion =“8”的基本功能。

有什么办法吗?可以在不同的包中创建两个活动,并从intent作为接口加载一个活动?任何想法?

4 个答案:

答案 0 :(得分:2)

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

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

为每个API级别重新实现整个活动是过度的。使用覆盖方法的类专门化并不是一种快乐的方式来做这种事情。绑定复杂性使得以这种方式工作变得困难。使用较小的辅助类或条件代码要好得多。

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

此模式的另一个示例是google 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功能;然后从主类或活动中的代码有条件地引用该类。 e.g:

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

Helper类模式对你没什么帮助,因为你显然不会重新实现下层平台上的功能。

答案 1 :(得分:1)

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

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

需要什么样的功能?

答案 2 :(得分:1)

您在Android开发者官方博客上详细解释了您所要求的内容:

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

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

答案 3 :(得分: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或Verion较低,则会加载基本功能。