2011-10-07 53 views
2

爲什麼要我招誰惹使用反射所討論here,如果我可以簡單地從Build.VERSION.SDK_INT測試Android版和更低版本的API無法有條件地運行的功能呢?使用Java反射VS檢查Build.VERSION.SDK_INT

article討論如何獲得方法ID,處理異常,等等,這似乎比單純使用更復雜:

if(Build.VERSION.SDK_INT>=11){ 
    // some Honeycomb code 
    // example: findViewById(R.id.root).setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 
} 

此代碼工作正常,我在各種設備上(2.2/3.2 /等)。

感謝

+0

如果通過「一些蜂窩碼」的意思是「我創建一個包含蜂窩代碼的類和調用的方法/做的東西」你的方法應該工作 - 否則你的應用程序將只是一個異常崩潰,當您嘗試加載的東西的代碼,是不是蜂窩(或更高版本) – Jens

+0

我的意思是比如調用View.setSystemUiVisibility這是自API實現11 –

回答

0

一個較舊的Android系統上運行時,如果隱藏在「//一些蜂窩代碼」的代碼你的建議將不會進行工作(無反射)使用類或方法的名稱,只有在存在蜂窩API。問題的根源在於所有從代碼引用的類都在加載類時加載。您需要使用反射來延遲包含Honeycomb引用的代碼的解析直到運行時。

特別是,如果你有一個類:

class MyUseOfFeatures { 
    public void doSomething() { 
     if (TestIfPhoneHasFancyHoneycombFeature()) { 
      Object example = android.util.JsonReader(); // JsonReader is new in 3.0 
     } 
} 

然後當JVM(?呃,DVM)加載字節碼該類它會嘗試解決這個android.util.JsonReader名上課的時候被加載(大概當你的應用程序被加載)。

如果僅僅依靠蜂窩的一些行爲(沒有任何任何新的類,方法或字段),那麼你會被罰款,只是測試版本號。

+0

當我寫的,上面的代碼工作正常的API 8和API 13.所以我不看不到你提到的問題。 –

+0

您在代碼中引用了哪些Honeycomb API或功能? –

+0

我在問題中添加了示例。 –