5

我是 Android/Java 新手。我想编写一个测试应用程序,在其中打印我添加到(自定义)意图的任何额外内容。当我收到我的意图时BroadcastReceiver,我可以通过以下方式获得所有额外的Bundle及其密钥:

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

如何找出与给定键关联的值的类型是什么?

我的想法是这样的:

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

但这种方式似乎不是最好的主意。另一种选择似乎是这样的:

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

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

我如何动态地知道给定键的值的类型?

4

3 回答 3

6

也许我应该通过比评论更好的答案来更好地解释我。

你可以做你想做的事。

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;
    }
}

不同之处在于他们不检查对象的类型,因为他们认为您知道自己在做什么。

来源

于 2013-10-22T13:36:25.553 回答
1

我相信您无法确定类型,如果您发送意图,那么您知道要接收什么,如果您从其他应用程序接收意图,请阅读他们的文档。如果他们希望您使用它,他们会记录下来 :)

于 2013-10-22T13:21:59.597 回答
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.getXXX,例如,如果类型为“java.lang.String”,则为 bundle.getString()。

于 2019-08-13T13:41:44.333 回答