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

Android,组合不同SDK版本的应用程序组件,android,plugins,android-intent,android-activity,target,Android,Plugins,Android Intent,Android Activity,Target,我正在寻找一种方法,如何组合不同SDK版本的组件 例如,我有一个应用程序可以与minSdkVersion=“8”配合使用。 但我希望有一个附加功能,需要minSdkVersion=“10” 也许是一个插件,然后动态加载?如果android设备有minSdkVersion=“10”,它将加载该插件。而在较低版本中,它只能与SdkVersion=“8”的基本功能配合使用 有什么办法吗?可以在不同的包中创建两个活动,并从intent加载一个活动作为接口吗?有什么想法吗?如果您使用支持库 需要什么样的

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

例如,我有一个应用程序可以与minSdkVersion=“8”配合使用。 但我希望有一个附加功能,需要minSdkVersion=“10”

也许是一个插件,然后动态加载?如果android设备有minSdkVersion=“10”,它将加载该插件。而在较低版本中,它只能与SdkVersion=“8”的基本功能配合使用


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

如果您使用支持库


需要什么样的功能?

如果使用支持库,还需要什么


需要什么样的功能?

Android开发者官方博客上详细解释了您的问题:


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

Android开发者官方博客上详细解释了您的问题:


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

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

因此,一般的方法是:针对目标SDK库进行链接;在使用更高版本SDK方法的代码中添加@decoration;修饰特定于特定构建的方法或类;按照“所有警告都是错误”的编码规则生存和死亡

为每个API级别重新实现整个活动是过分的。使用重写方法进行类专门化并不是一种很好的方法。绑定的复杂性使得以这种方式工作非常困难。使用较小的助手类或条件代码要好得多

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

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

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

  if (Build.Version >= 10) { 
      Call an API 10 method.
  }
也非常有效。Davlik虚拟机确实会通过LogCat中的调试消息发出一点呜呜声。因此,如果你一直这样做,可能会有一些开销。如果要在底层平台上执行API-10方法,Davlik加载程序将生成代码,在执行时抛出运行时异常,而不是执行调用。但是代码链接和加载很好。if语句是防止执行缺少的方法所需的全部内容。在小剂量的情况下,条件代码是完全可以的。如果有很多特定于平台的代码,那么最好以某种方式将特定于平台的功能封装在类中

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

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

Helper类模式对您没有多大帮助,因为您显然不会在底层平台上重新实现功能。

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

因此,一般的方法是:针对目标SDK库进行链接;在使用更高版本SDK方法的代码中添加@decoration;修饰特定于特定构建的方法或类;按照“所有警告都是错误”的编码规则生存和死亡

为每个API级别重新实现整个活动是过分的。使用重写方法进行类专门化并不是一种很好的方法。绑定的复杂性使我
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{}