標籤:android 相容性
原文地址:http://developer.android.com/guide/practices/compatibility.html
android被設計成可以在多種不同的裝置上啟動並執行系統,為了達到這個目的,android系統提供了一個動態app架構,在這個架構中你可以在動態檔案(為不同螢幕大小的不同xml布局檔案)中提供具體的配置資源,android會根據裝置配置載入適當的資源。
相容性是什麼意思?
有兩種不同的適配:裝置適配和app適配。
裝置相容:能夠在android執行環境下正常運行應用程式。
作為一個app開發人員,你不需要是否一個裝置是裝置相容的。但是你必須得考慮在這樣潛在的裝置配置下的app適配。
讓你的應用對裝置來說可用
一些特徵是基於硬體的比如指南針感應器,一些是基於軟體的不如app widgets,一些是基於平台版本的.
為了實現你的應用程式的最大的使用者群,你應該努力使用一個apk來支援越多的裝置配置越好。在很多情況下,你應該在運行時禁用可選的功能,為不同的配置提供應用程式資源的替代品(比如為不同的螢幕尺寸提供不同的布局檔案),如果必須,你需要通過Google play的以下特徵來限制你的應用程式的可用性:
1,裝置特徵
2.平台版本
3.螢幕配置
裝置特徵
為了讓你基於裝置特徵合適的管理你的app,android定義了featuresIds,比如說指南針感應器的featureid是FEATURE_SENSOR_COMPASS , app widgets的feature id是FEATURE_APP_WIDGETS.
如果必要的話,你可以保護安裝你的app但是他們的裝置沒有提供在你的manifest檔案中用<uses-feature> 聲明的feature的使用者.
比如說,你的app不會再一個缺少指南針感應器的裝置上起作用,你可以這樣在你的manifest檔案中聲明指南針感應器:
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ...</manifest>
Google play 商店比較你app聲明的feature和使用者裝置中上的feature,來決定你的app是否相容每個應用。若裝置沒有提供所有你的app需要的feature,使用者就不能安裝你的app.
但是,若你的app的主要作用不需要一個裝置feature,你需要設定required屬性為false而且在裝置運行時檢測裝置feature,若你的app feature在當前裝置不可用,你需要優雅的降解app feature,比如,你可以像這樣通過調用hasSystemFeature()查詢一個feature是否可用:
PackageManager pm = getPackageManager();if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { // This device does not have a compass, turn off the compass feature disableCompassFeature();}
平台版本
比如, Calendar Provider API是在API level 14之後添加的,如果你的app必須使用這個api,你可以這樣聲明你支援的最低版本號碼是14:
<manifest ... > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> ...</manifest>
targetSdkVersion 是重要的,因為它暗示系統你的app是否繼承在新版本中的行為改變,若你不把
targetSdkVersion更新到最新版本,這時系統假設在運行最新版本sdk時,你的app需要的是先前相容的行為。
若你的app使用一些在最近的sdk版本中添加的api,但是不把他們作為主要功能,你應該在運行時檢查API levels,同時當API level太低時,優雅的降低符合的feature.這種情況下,將能支援你app啟動並執行最低的APIlevel賦值給minSdkVersion,然後比較當前系統版本SDK_INT 與你想檢查的符合的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();}
螢幕配置
為了通過裝置的螢幕類型將裝置分類,Android為每個裝置定義了兩種特徵:螢幕尺寸(small, normal, large, and xlarge)和螢幕密度(mdpi (medium), hdpi (hdpi), xhdpi (extra high), xxhdpi (extra-extra high), and others.)。
預設情況下你的app是相容所有尺寸和密度的,系統為每個螢幕對你的UI布局和image資源做了合適的調整,但是你應該通過為不同尺寸的螢幕添加特殊的布局和為普通螢幕密度最佳化bitmap images來最佳化使用者體驗。
出於商業原因,控制應用程式的可用性
你應該為了商業或法律的原因來限制你的app的可用性,不如一個展示倫敦地下列車表的應用不能在英國之外使用,對於這種類型的情況,Google play在開發人員控制台提供了過濾選項來允許你控制你的應用在非技術方面的可用性,比如使用者位置。