【问题标题】:Android: how to code depending on the version of the API?Android:如何根据 API 的版本进行编码?
【发布时间】:2010-11-30 20:31:16
【问题描述】:

在 Android 中,我很容易获得 SDK 的版本 (Build.VERSION.SDK),但只有当平台高于 1.6 (>Build.VERSION_CODES.DONUT) 时,我才需要使用 LabeledIntent。

我认为反射是必要的(我已阅读this link,但对于班级或我来说并不清楚)。

这是代码,但它给了我一个例外,因为在我的 Android 1.6 中,即使未应用条件,编译器也会验证包是否存在:

 Intent theIntent=....;
      if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT)
   {    
 try{
             Intent intentChooser = Intent.createChooser(intent,"Choose between these programs");
              Parcelable[] parcelable = new Parcelable[1];
              parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0);
               intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable); 
  activity.startActivity(intentChooser);
   }
   catch(Exception e)
   {
    activity.startActivity(theIntent);
   }

  } else
  {
   activity.startActivity(intentMedicamento);
  }

我是如何解决的,正确答案的一些注释

@Commonsware 告诉我如何做到这一点。我们创建了一个桥接类,以便根据 API LEVEL 实例化一个使用 API LEVEL 的类或使用另一个 API LEVEL 的另一个类。 初学者可能会忘记的唯一细节是,您必须使用要参考的最新 SDK 编译您的应用程序。

public abstract class LabeledIntentBridge {
 public abstract Intent BuildLabeledIntent(String URL, Intent theintent);

 public static final LabeledIntentBridge INSTANCE=buildBridge();

 private static LabeledIntentBridge buildBridge() {
  int sdk=new Integer(Build.VERSION.SDK).intValue();

  if (sdk<5) {
   return(new LabeledIntentOld());
  }

  return(new LabeledIntentNew());
 }
}

所以在LabeledIntentNew 中,我包含了所有引用LabeledIntent 的代码,仅在API LEVEL 5 中可用。在LabeledIntentOld 中,我可以实现另一种控制,在我的情况下,我返回意图本身而不什么都不做。

对这个类的调用是这样完成的:

LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);

【问题讨论】:

  • 您在项目中使用的是哪个框架版本?
  • @Flo.- 我的 AndroidManifest 定义了 minSdkVersion="4"。 LabeledIntent 仅包含在 API LEVEL 5 以上的 SDK 中。
  • 是的,但您的项目中实际使用的是哪个框架版本? minSdkVersion 只是清单文件中的元信息。创建项目时,您应该在创建对话框中选择了框架版本。
  • @Flo.- 我在 2.2 和 1.6 之间切换,我的应用程序必须与两者兼容。
  • 好的,那么当您切换回 1.6 时,编译器当然会抛出错误,因为您尝试使用的类不在 Android 1.6 框架中。正如您已经说过的,您必须使用反射,就像您链接到的博客文章中提到的那样。

标签: android reflection


【解决方案1】:

【讨论】:

  • 我看不清楚。在链接中,他们使用方法 Debug.class.getMethod(),这将是检索 LabeledIntent 类的方法?感谢提供一些代码。
  • @netadictos:查看github.com/commonsguy/cw-advandroid/tree/master/Contacts/… 了解解决问题的另一种方法。
  • 它可以以另一种方式帮助我创建微调器,但为了兼容,您指示我的代码不能编译为 1.6,因为当我使用 Android 1.6 时,它无法识别类 android.provider.ContactsContract。它必须为 2.2 编译并在 1.6 手机上运行吗?
  • 非常感谢,最后我模仿了你的代码,我想执行一个引用新的 api 类的包是没有问题的,只要它们驻留在未实例化的类中。我在回答中注释了我所做的事情。最好明确(对于初学者级别)您必须使用较新的 SDK 进行编译,否则它将无法编译。
【解决方案2】:

你必须使用反射... 这个想法很好,但是在您的代码中,您引用了 1.6 中不可用的 LabeledIntent。因此,当您的应用在 1.6 设备上运行时,它找不到类并崩溃。

因此,我们的想法是编写在 1.6 中运行时不引用 LabeledIntent 的代码。为此,您可以编写一个扩展 LabeledIntent 的包装类 (LabeledIntentWrapper) 并在您的函数中调用它。因此,在 1.6 中,设备将看到对已知类的引用:LabeledIntentWrapper。

【讨论】:

  • 问题是您仍然使用对 LabeledIntent 的引用。这就是为什么我提到反射,它是必不可少的,但我真的不知道如何实现它,因为它有参数。
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2020-04-26
  • 1970-01-01
  • 2023-03-12
  • 2017-02-02
  • 2020-06-25
相关资源
最近更新 更多