2013-05-14 60 views
2

我知道有(至少)兩種方式做運行時檢查,以確保我的代碼不會調用的API不存在:Android的向後兼容性:反射對簡單的條件檢查

但我不明白什麼時候應該用一種技術來代替另一種技術。當試圖使用Android 可能不存在,因爲這樣的裝載在我的代碼中引用的類會造成致命錯誤的反思似乎有必要。但是如何調用屬於我知道的類的方法呢?例如,在設備上運行2.2(API 8):

protected void onCreate(Bundle savedInstanceState) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { 
     ActionBar actionBar = getActionBar(); 
    } 
... 

這是總是安全,還是有情況,其中一個崩潰會怎樣呢?是否有任何理由檢查活動中是否存在使用反射而不是使用上述版本檢查的「getActionBar」方法?

回答

3

但我不明白什麼時候應該用一種技術來代替另一種技術。

使用第一項符號技術。

這是否總是安全的,或者是否有發生碰撞的情況?

首先,您需要更改到HONEYCOMB,爲ActionBar類是在API級別11

除此之外加入,只要你只支持Android 2.0的高,你的罰款。如果你仍然支持的Android 1.x中,你需要重寫你的代碼爲:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    HoneycombHelper.doSomethingCoolWithTheActionBar(); 
} 

其中HoneycombHelper是你寫另一個類,它包含您的API級別11碼(例如,ActionBar actionBar = getActionBar())。

這個區別是因爲Android 1.x上的Dalvik會快速失敗,只要您嘗試加載包含無法識別的引用的類時就會給出VerifyError。除非您實際執行包含無法識別的引用的語句,否則Android 2.0+將不會失敗,並且您的if測試應該阻止此操作。

是否有任何理由檢查活動中是否存在「getActionBar」方法使用反射而不是使用上述版本檢查?

號只需設置您的構建目標(例如,項目>屬性>的Android在Eclipse),以高到足以覆蓋你要引用的一切,並設置android:minSdkVersion你願意支持水平的值。任何你嘗試使用的東西比android:minSdkVersion都會被標記爲Lint的錯誤,並且你可以添加你的Java版本守護塊(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.WHATEVER))和@TargetApi()註釋讓林特停止抱怨。