要定位多個平臺,您需要在構建項目時指定最低SDK級別和目標SDK級別。您將項目配置爲與目標SDK構建鏈接。如果您使用當前平臺上不存在的方法執行調用,則Davlik VM將生成運行時異常。編譯器將針對最低SDK級別不可用的調用生成警告。有各種Java @聲明可以禁止類,方法或特定引用的警告。在Eclipse中按F2鍵自動生成適合的Java裝飾。這聽起來很嚇人。但實際上,這些警告讓你可以相對無畏地編碼。
所以一般的做法是:鏈接到目標SDK庫;將@ decorations添加到使用更高SDK構建方法的代碼中;裝飾特定構建特有的方法或類;並通過「所有警告都是錯誤」的編碼規則來生與死。
重新實現每個API級別的整個活動是過度的。使用overriden方法進行類專業化並不是一種快樂的方式來完成這種事情。綁定複雜性使得以這種方式工作很困難。最好使用較小的輔助類或條件代碼。
編寫Helper類有各種約定 - 實質上是每個API級別的單獨實現類,每個實現類都實現一個通用接口或抽象基類。 Android開發人員博客中提供的方法是一種相當簡潔的方法。模式上有很多細微的變化,全部基於獲得特定API級別的助手類的實例。
這種模式的另一個例子是在ActionBarCompat庫中使用的IActionBarHelper接口。在這種情況下,您的活動繼承自ActivityCompat而不是Activity,實例方法ActivityCompat.getActionBarHelper()返回IActionBarHelper的實現,爲您運行的平臺提供適當的實現。在這種情況下,這些實現包含一個公平的初始化狀態位,以及與該活動關聯的狀態;所以從成員方法獲得實現是有意義的。
儘管如此,Davlik VM完全可以處理沒有鏈接的內聯方法。
if (Build.Version >= 10) {
Call an API 10 method.
}
也工作得很好。 Davlik VM通過LogCat中的調試消息發出一點點抱怨。所以如果你一直這樣做,可能會有一些開銷。如果您要在底層平臺上執行API-10方法,則Davlik加載器將生成執行代碼時拋出運行時異常而不是執行調用的代碼。但代碼鏈接並加載正常。 if語句是您防止執行缺少方法所需的全部內容。小劑量,有條件的代碼是完全可以的。如果有很多特定於平臺的代碼,那麼以某種方式封裝特定於平臺的函數可能更好。
對於那些或者不存在的功能,比如您的NFC示例,最好的處理方式可能是在一個類中實現儘可能多的NFC功能;然後從您的主類或活動中的代碼中有條件地引用該類。例如:
void onCreate(...)
{
if (Build.Version >= 10)
{
mNfcReceiver = new NfcReceiver(getContext());
}
}
Helper類模式並不能真正幫到你很多,因爲你顯然不打算在底層平臺上重新實現功能。
我想你可以用''Build.VERSION''來僞裝你的應用運行在不同API級別之間。然後使用if-elses在代碼級別上採取相應措施。 – harism
問題是,在清單文件中,我需要指定minSdkVersion。如果我想構建一個支持minSdkVersion = 10的組件,我不能用minSdkVersion = 8編譯這個包。所以我想加載額外的組件dynamicaly ...不知何故:) – user1908375
恐怕唯一的辦法就是根據你使用的最高API進行編譯,並確保沒有較高級別的API調用在較低的API上調用。 – harism