我是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和自定义默认类型值。)
如何动态了解给定键的值类型?
答案 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;
}
}
不同之处在于他们不会检查对象的类型,因为他们认为你知道自己在做什么。
答案 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”。