Device Compatibility

来源:互联网 发布:完美刷机解网络锁 编辑:程序博客网 时间:2024/06/06 09:51

见https://developer.android.com/guide/practices/compatibility.html#filtering

Divice Compatibility(2017年3月12日)
兼容性分为设备兼容和应用兼容
作为一个app开发者,你不需要担心是否一个设备是Android兼容的,因为只有当设备是Android兼容时,才包含google play商店。因此,你大可放心,从google play商店安装你的app的使用者正在使用一个Android兼容的设备。
然而,你确实需要考虑你的app是否和每一个潜在的设备配置是兼容的。因为Android运行在一个广泛的设备配置上,一些特征不是在所有的设置上是可用的。例如,一些设备可能不包含罗盘传感器,如果你的app的核心功能要求使用罗盘传感器,则你的app只能用在包含罗盘传感器的设备上
Android支持一系列特征,这些特征是关联平台API的。一些特征是基于硬件的(如罗盘传感器),一些是基于软件的,一些是依赖平台版本的。不是所有的设备都支持每一个特征,因此你可能需要控制你的app对设备的有效性,那些设备应该具备你的app要求的特征
Android为那些在所有设备上可能不可用的硬件或者是软件特征定义了ID,例如,罗盘传感器是FEATURE_SENSOR_COMPASS,app小部件是FEATURE_APP_WIDGETS
如果必要,你可以阻止用户安装你的app,当他们的设备不能提供一个给出的特征,这个特征声明在你的app的manifest文件的<uses-feature>元素中
例如,如果你的app不能在一个缺少罗盘传感器的设备上工作,你可以声明这个罗盘传感器作为一个必要的,在manifest中,如下:
<manifest ... >
   
<uses-feature android:name="android.hardware.sensor.compass"
                 
android:required="true" />
    ...
</manifest>
google play商店会比较你的app中要求的特征在每个用户设备上的合理性,去决定是否你的app与每个设备是可兼容的。如果这个设备不能提供你的app上的所有特征,这个用户就不能安装你的app
然而,如果你的app的主要功能不要求这个设备的特征,你应该设置相应的required为false,然后在运行时核查这个特征。如果这个app的特征在当前的设备上不可用,适当的降低相应的app特征(即关闭该特征)。例如,你可以查询一个特征是否是可用的,通过调用hasSystemFeature(),向下面这样

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
   
// This device does not have a compass, turn off the compass feature
    disableCompassFeature
();
}

平台版本
不同的设备可能运行在不同的Android平台版本下,例如Android4.0,Android4.4。 每一个连续的平台版本经常增加一些新的API,这些API并不适合在先前的版本。为了表名哪些API组是可用的,每个平台版本指定一个API等级。例如,Android1.0 的API等级是1,Android 4.4 的API等级是19
API等级允许你去声明你的app兼容的最低版本,通过在manifest中使用<uses-sdk>和minSdkVersion属性
例如,日历API被增加到Android4.0(API等级为14).如果你的app没有这些API就不能工作,你应该声明API等级为14,作为你的app的最低支持版本,如下:
<manifest ... >
   
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
    ...
</manifest>
minSdkVersion属性声明了你的app可兼容下的最低版本,targetSdkVersion属性声明了在你的app已经优化下的最高的版本
每一个Android的连续版本都为app提供可兼容性,这些app使用以前平台版本进行构建。因此你的app中使用的API应该总是和未来的Android版本相对应的API是可兼容的(即你的app以前调用的是低版本的API,现在系统升级了,也可以调用高版本对应的API,只是高版本增加的API不能够调用)
note:targetSdkVersion属性不会阻止你的应用安装在一个比该值更高的平台版本上,但是它的重要性在于,指示系统是否应该在一个新的版本下继承行为改变。如果你不更新targetSDKVersion到最近的版本,当运行在最近的版本,系统会假定你的应用要求一些后向兼容行为。例如,在Android4.4的行为改变中,使用AlarmManager API创建的报警默认情况是不正确的,因此系统可以批处理应用报警并保留系统电源,但是如果你的targetSdkVersion低于19,系统将会为你的应用保留先前API的行为
但是,如果你的app使用的是一个最近平台版本中的,但又不要求它们作为主要的功能,你应该在运行时核查API等级,并在API等级太低时降低相应的功能。在这种情况下,设置minSdkVersion尽可能到达到你的app主要功能的最低值,然后将当前系统的版本SDK_INT与Build.VERSION_CODES中对应的要检查的API等级的代码常量进行比较,例如:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
   
// Running on something older than API level 11, so disable
   
// the drag/drop features that use ClipboardManager APIs
    disableDragAndDrop
();
}
【这里顺便说一下:API等价minSdkVersion,是app上调用的API最低的要求,也就是说如果你要将app安装在一个系统上,那么这个系统的platform Version对应的API必须要大于等于它的值,才能运行app上的功能,而如果这个系统的platform Version对应的API的值小于minSdkVersion,说明该app不能正常运行在该系统,这是不允许的】

0 0
原创粉丝点击