兩種類型的兼容性:設備兼容性和應用兼容性。html
設備的Android兼容性就是app可以正確運行的Android執行環境(Android execution environment)。Android執行環境的具體定義可參見 Android compatibility program,而且每一個設備都必須經過CTS(Compatibility Test Suite)的兼容性認證。android
設備的Android兼容性主要目的是:web
做爲一個應用開發者,咱們不須要關心設備的Android兼容性,只須要關心app是否和不一樣廠商的設備兼容。由於Android運行的設備配置很是普遍,有些功能不是全部的設備都擁有的。好比有些設備可能沒有羅盤傳感器,而你的app核心功能正好須要羅盤傳感器,這就會形成app與不一樣設備的兼容性問題。app
Android支持多種功能。有些功能是基於硬件的(好比羅盤傳感器)、有些是基於軟件的(好比app widget),還有一些是基於系統版本的。不是全部的設備都能支持全部的功能的,所以,須要基於app請求的功能來控制app的兼容性。ide
爲了可以達到一個app適配不一樣設備的目的,結合上述Android的功能情景,app兼容不一樣設備能夠經過一下三個方面:佈局
Android爲每個硬件功能和軟件功能都定義了功能ID。舉例來講,羅盤傳感器的功能ID是FEATURE_SENSOR_COMPASS,app widget的功能ID是
優化FEATURE_APP_WIDGETS。
必要的話,能夠在mainifest中聲明<uses-feature>
元素,阻止沒有某一功能的設備用戶安裝app。例如:ui
1 <manifest ... > 2 <uses-feature android:name="android.hardware.sensor.compass" 3 android:required="true" /> 4 ... 5 </manifest>
然而,若是app的主要功能並不是是請求某個設備功能,能夠設置屬性required
爲「false」而且在運行時檢查這個設備功能,代碼以下:編碼
1 PackageManager pm = getPackageManager(); 2 if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { 3 // This device does not have a compass, turn off the compass feature 4 disableCompassFeature(); 5 }
注意:有些system permissions會隱藏着要求一些設備功能。好比藍牙權限BLUETOOTH就隱含着請求使用設備功能 FEATURE_BLUETOOTH。更多的隱藏請求功能見 Permissions that Imply Feature Requirements。
spa
不一樣的設備可能運行在不一樣的系統版本上。每一個連續版本一般都會增長一些API,這些新增的API在舊版本中是不能用的。能夠在manifest中使用<uses-sdk>
標籤和它的minSdkVersion
屬性,來聲明app最低兼容的版本。
使用舊版本的API進行編碼可以確保app前向兼容(兼容舊版本以後的),所以在使用API時務必要查看文檔肯定其API LEVEL。
1 <manifest ... > 2 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> 3 ... 4 </manifest>
minSdkVersion
:聲明app編譯的最低版本。targetSdkVersion
:聲明app優化的最高版本。Android運行在各類尺寸的設備上,從手機到平板再到電視等等。爲了分別屏幕類別,Android爲每一個設備都定義了兩個特色:屏幕尺寸(屏幕的物理大小)和屏幕密度(在屏幕上像素物理密度,被成爲DPI)。
默認狀況下,app是兼容全部屏幕尺寸和密度的,由於必要的時候,系統會給每一個屏幕適當的調整UI佈局和圖片資源。但仍是須要爲每種屏幕配置優化用戶體驗。爲不一樣的屏幕大小增長特定的佈局,爲共同的屏幕密度優化位圖圖片。
關於如何爲不一樣屏幕建立可選資源和如何限定app使用某個屏幕大小,參見 Supporting Different Screens。