2013-10-22 30 views
3

我是Android/Java的新手。我想編寫一個測試應用程序,其中打印了添加到(自定義)意圖的任意附加內容。 當我收到的意圖與我BroadcastReceiver,我可以通過所有的演員作爲Bundle和他們的鑰匙:在Bundle中,如何找出給定鍵的值的類型?

Bundle bundle = intent.getExtras(); 
Set<String> keys = bundle.keySet(); 

如何找出與給定鍵關聯的值的類型?

我當時的想法是這樣的:

Object tmp = bundle.get(key); 
// utilize https://stackoverflow.com/questions/709961/ 

但這way似乎不是最好的主意。另一種選擇似乎是這樣的:

if (bundle.getBoolean(key) == null) { 
    // can't determine if `null` was explicitly associated or not 
} else if /* ... */ 

但這種方式我不能確定是否空值是否打算。 我可以創建一個自定義的默認值類,但我不確定這是否是預期的方式。編輯我剛剛意識到我需要一個相同類型的默認值,所以我甚至不能這樣做。 (但是可以仔細檢查空值和需要知道的自定義默認類型值。)

如何知道動態給定鍵的值的類型?

+0

您可以使用「的instanceof」知道什麼樣的對象被鏈接到一個關鍵。關於最後一點,如果你得到一個關鍵字null,這意味着它是以任何其他方式完成的,它不會存在該關鍵字。 – Juangcg

+1

也許這個答案可以幫助你:http://stackoverflow.com/a/7163619/2065418 –

+0

@Juangcg但在getBoolean的情況下,它應該返回一個原始類型的'boolean' - 做'instanceof'工作原始類型? – n611x007

回答

4

也許我應該更好地解釋我通過比評論更好的答案。

你可以做你想做的事情。

Object tmp = bundle.get(key); 
if (tmp instanceof Boolean) { 
    boolean finalValue = ((Boolean)tmp).booleanValue(); 
} 

如果你檢查Android的源代碼,你會看到類似的東西,它們總是傳遞包裝而不是原始類型。

public boolean More ...getBoolean(String key, boolean defaultValue) { 
    Object o = mMap.get(key); 
    if (o == null) { 
     return defaultValue; 
    } 
    try { 
     return (Boolean) o; 
    } catch (ClassCastException e) { 
     typeWarning(key, o, "Boolean", defaultValue, e); 
     return defaultValue; 
    } 
} 

不同之處在於,他們不檢查對象的類型,因爲他們假設你知道你在做什麼。

source

+0

@naxa再多一次評論,在所有類型檢查之前,您需要檢查是否爲null。 – Juangcg

+0

這是真的,事實上我會發布這樣的東西,但混淆與獲取SharedPreferences數據 –

+0

剛剛測試時所需的默認值,是不是'((布爾)tmp).booleanValue()'? – n611x007

1

我相信你不能確定類型,如果你發送意圖然後你知道接收什麼,如果你從其他應用程序接收意圖只是閱讀他們的文檔。他們會記錄它,如果他們希望你使用它:)

+0

我明白了。但是,也許我的測試應用程序是探索任何無證的意圖? :) – n611x007

+0

像什麼?對不起,我只是好奇:) –

+1

實際上沒有什麼絕密,我們與公司合作,他們的文件和規格有時不明確,缺少或更改,恕不另行通知。我們通過電子郵件交流,但這並不是最快的,所以你只想知道他們的新代碼中究竟發生了什麼,如果沒有其他的東西,那麼查明文檔中的錯誤/缺失。 – n611x007

相關問題