构建兼容性程序的手法主要有以下几种:
一、利用PackageManager的hasSystemFeature()
Package Manager包含每个可选硬件的一个常量,从而允许根据可用硬件自定义应用程序的UI和功能。
PackageManager pm = getPackageManager(); if(pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)){ }
二、利用API level
if(android.os.Build.VERSION.SDK_INT > 14){ }
三、利用反射或异常
使用反射或异常来检查当前设备是否支持特定的类或方法。反射和异常在Android中都是很慢的操作,所以最好是使用SDK版本来确定哪些是可用的类。想要确定特定类或方法所需的API level,最简单的方法是逐步降低构建项目所需的平台版本,注意哪些类导致构建失败。
private static boolean fragmentsSupported = true; static { try { checkFragmentsSupported(); } catch (NoClassDefFoundError e) { fragmentsSupported = false; } } private static void checkFragmentsSupported() throws NoClassDefFoundError { fragmentsSupported = android.app.Fragment.class != null; }
四、使用并行Activity
最简单、也是最低效的方法是根据与你支持的最小Android平台版本相兼容的基类,创建单独的并行Activity、Service和Broadcast Receiver集合。
当使用显式的Intent来启动Service或Activity时,通过检查平台版本并相应地将启动目标确定为相应的Service和Activity,可以在运行时选择正确的组件集合:
if(nfc_beam_supported) startActivityIntent = new Intent(this, NFCBeamActivity.class); else startActivityIntent = new Intent(this, NonNFCBeamActivity.class); startActivity(startActivityIntent);
五、对于隐式Intent和Broadcast Receiver的情况,可以在它们的manifest的相关声明中添加一个引用自Boolean资源的android:enabled标签:
<receiver
android:name=".MediaControlReceiver"
android:enabled="@bool/supports_remote_media_controller">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
然后可以根据API level创建其他的资源条目:
res/values/bool.xml
<bool name="supports_remote_media_controller">false</bool>
res/values-v14/bool.xml
<bool name="supports_remote_media_controller">true</bool>
六、接口和Fragment
IP2PDataXfer dataTransfer; if(android.os.Build.VERSION.SDK_INT > 14){ dataTransfer = new NFCBeamP2PDataXfer(); }else{ dataTransfer = new NonNFCBeamP2PDataXfer(); } dataTransfer.initiateP2PDataXfer();