出于调试的原因,我想列出一个Intent的所有附加项(以及它们的值)。现在,拿到钥匙不是问题

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

但是获取键的值对我来说是一个,因为有些值是字符串,有些是布尔值……如何在循环中获取值(遍历键)并将值写入日志文件?谢谢你的提示!


当前回答

你可以使用for(字符串键:键){对象o = get(键);为了返回一个对象,在它上调用getClass().getName()来获得类型,然后做一组if name.equals("String")类型的事情来计算出你实际上应该调用哪个方法,以获得值?

其他回答

你可以使用for(字符串键:键){对象o = get(键);为了返回一个对象,在它上调用getClass().getName()来获得类型,然后做一组if name.equals("String")类型的事情来计算出你实际上应该调用哪个方法,以获得值?

你可以在一行代码中完成:

Log.d("intent URI", intent.toUri(0));

它输出如下内容:

“#意图;行动= android.intent.action.MAIN;类别= android.intent.category.LAUNCHER; launchFlags = 0 x10a00000;组件= com.mydomain.myapp / .StartActivity; sourceBounds = 12% 20870% 20276% 201167;l.profile = 0;端”

在这个字符串的末尾(我加粗的部分),您可以找到额外的列表(在这个示例中只有一个额外的)。

这是根据toUri文档: URI包含了作为基本URI的意图数据,以及描述动作、类别、类型、标志、包、组件和额外内容的额外片段。

如果为了调试,你想要的只是一个字符串(OP暗示了,但没有显式声明),只需在额外的Bundle上使用toString:

intent.getExtras().toString()

它返回一个字符串,例如:

Bundle[{key1=value1, key2=value2, key3=value3}]

Bundle.toString()(不幸的是,它是默认的Object.toString() javadoc,因此在这里非常无用。)

private TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tv = new TextView(this);
    tv.setText("Extras: \n\r");

    setContentView(tv);

    StringBuilder str = new StringBuilder();
    Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        Set<String> keys = bundle.keySet();
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            str.append(key);
            str.append(":");
            str.append(bundle.get(key));
            str.append("\n\r");
        }
        tv.setText(str.toString());
    }
}

在Kotlin中将它作为一个用“,”分隔的字符串!

val extras = intent?.extras?.keySet()?.map { "$it: ${intent.extras?.get(it)}" }?.joinToString { it }

基于ruX的答案。