Android:如何根据API的版本进行编码?

时间:2010-11-25 11:11:19

标签: android reflection

在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中,我包含了仅在API LEVEL 5中提供的引用LabeledIntent的所有代码。在LabeledIntentOld中,我可以实现另一种控件,在我的情况下我没有做任何其他事情就返回了意图本身。

对此类的调用如下所示:

LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

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

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