2013-01-11 53 views
0

我正在尋找一種方法,如何組合不同SDK版本的組件。Android,結合不同SDK版本的應用程序組件

例如,我有一個適用於minSdkVersion =「8」的APP。 但我想有一個額外的功能,需要minSdkVersion =「10」。

也許類似於插件並加載它動態?如果android設備有minSdkVersion =「10」,它會加載該插件。而通過較低版本,它可以使用SdkVersion =「8」的基本功能。

有沒有辦法呢?可以在不同的包中創建兩個活動並從intent加載一個活動作爲界面?有任何想法嗎?

+0

我想你可以用''Build.VERSION''來僞裝你的應用運行在不同API級別之間。然後使用if-elses在代碼級別上採取相應措施。 – harism

+0

問題是,在清單文件中,我需要指定minSdkVersion。如果我想構建一個支持minSdkVersion = 10的組件,我不能用minSdkVersion = 8編譯這個包。所以我想加載額外的組件dynamicaly ...不知何故:) – user1908375

+0

恐怕唯一的辦法就是根據你使用的最高API進行編譯,並確保沒有較高級別的API調用在較低的API上調用。 – harism

回答

1

而且,如果您使用支持庫?

http://developer.android.com/training/basics/fragments/support-lib.html

什麼樣的功能需要的?

+0

NFC adapater ..它由sdkversion = 10支持。我的應用程序建立在sdkversion = 8 ..這個NFC插件應該只是一個附加功能的應用程序。所以可惜增加sdkversion和失去用戶只是因爲一個「插件」.. – user1908375

+0

也許這個職位可以幫助你,http://stackoverflow.com/questions/11070492/checking-nfc-feature-on-android-device如果你使用sdk 10,但你設置了minSDK 8 – jackgris

2

要定位多個平臺,您需要在構建項目時指定最低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類模式並不能真正幫到你很多,因爲你顯然不打算在底層平臺上重新實現功能。

+0

謝謝所有的答案..我可以在eclipse中使用@devices來解決這個問題:@SuppressLint(「NewApi」)。然後我檢查是否有類似的情況: if(Build。版本> = 10){加載NFC類別擴展基本類別 }其他{ 加載基本類別 } – user1908375

0

謝謝所有的答案..我可以在eclipse中使用@裝飾來解決這個問題:@SuppressLint(「NewApi」)。

在我的父母活動中,我剛剛檢查了VERSION和NFC支持並寫入this.supportNFC;之後,我選擇要加載的意圖

if(this.supportNFC == KITAPP.NFC_ENABLED){ 
    intent = new Intent(this, ActivityNFC.class); 
} else { 
    intent = new Intent(this, ActivityBasic.class); 
} 
startActivityForResult(intent, 0); 

順便說一句,

class ActivityNFC extends ActivityBasic{} 

所以我只是伸出我的NFC級與NFC附加功能。但是,如果移動設備不支持NFC或Verion較低,則會加載基本功能。

相關問題