在Bundle中,如何找出给定键的值的类型?

时间:2013-10-22 13:14:46

标签: java android android-intent bundle primitive

我是Android / Java的新手。我想编写一个测试应用程序,其中打印任何我添加到(自定义)意图的任意额外内容。 当我通过BroadcastReceiver收到意图时,我可以通过以下方式获取所有额外内容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 /* ... */

但是这样我无法确定是否有空值。 我可以创建一个自定义默认值类,但我不确定这是预期的方式。 编辑我刚刚意识到我需要一个相同类型的默认值,所以我甚至不能这样做。 (不过,可以仔细检查null和自定义默认类型值。)

如何动态了解给定键的值类型?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我相信您无法确定类型,如果您发送意图然后您知道要接收什么,如果您从其他应用程序接收意图只是阅读他们的文档。如果他们想要你使用它们,他们会记录它:)

答案 2 :(得分:0)

这是一个老问题,但我为恕我直言提供了一种优雅的新解决方案。

    //@ Dump key types in bundle
   void showKeyTypesInBundle(
            Bundle bundle)  // bundle to query
    {
        // Notes:
        // 'print()' is my output function (e.g. Log.i).
        // keys with null values are not shown.

        int size;
        Set<String> ks = bundle.keySet();   // get keys in bundle
        size = ks.size();                   // get key count

        print( "KEYS IN BUNDLE:" );
        if( size > 0 ) {                    // any keys in bundle?
            for (String key : ks ) {        // for every key in keyset...
                String type = getKeyType(bundle, key);  // get type
                print("  key \"" + key + "\": type =\"" + type + "\"");
            }
        }
        else {                               // no keys in bundle?
            print( "  No Keys found" );
        }
        print( "END BUNDLE." );
    }

    //@ Get type of bundle key
    String getKeyType(
            Bundle bundle,  // bundle containing key
            String key)     // key name

    {
        Object keyobj;
        String type;

        if( bundle == null || key == null ) return( null );     // bad call/

        keyobj = bundle.get( key );                             // get key as object
        if( keyobj == null ) return( null );                    // not present?
        type = keyobj.getClass().getName();                     // get class name
        return( type );
        // Returns name of key value type
        // e.g. "java.lang.String" or "java.lang.Integer"
        // or null on error        }
    }

如果需要,您可以根据类型(例如, bundle.getString(),如果类型为“ java.lang.String”。