代码之家  ›  专栏  ›  技术社区  ›  netadictos

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

  •  9
  • netadictos  · 技术社区  · 14 年前

    在Android中,我很容易得到SDK的版本( Build.VERSION.SDK )但我需要使用LabeledIntent只有当平台比1.6更新时( >Build.VERSION_CODES.DONUT )

    我认为反思是必要的(我读过 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);
      }
    

    我是怎么解决的,一些正确答案的注释

    @公共软件告诉我怎么做。我们创建一个桥类,以便根据API级别,您可以引用一个使用API级别的类或另一个使用另一个API级别的类。 唯一一个初学者可能忘记的细节是,你必须用最新的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 5级。在 LabeledIntentOld ,我可以实现另一种控制,在我的情况下,我返回意图本身而不做任何其他事情。

    对该类的调用如下所示:

    LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   CommonsWare    14 年前
        2
  •  1
  •   Cédric Coulon    14 年前

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

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