列出一个意图的所有附加

出于debugging的原因,我想列出一个意图的所有额外(和他们的价值观)。 现在,获得钥匙不是问题

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

但获取键的值是一个对我来说,因为一些值是string,一些是布尔值…我怎么能得到一个循环中的值(循环通过键),并将值写入日志文件? 感谢任何提示!

以下是我用来获取无证(第三方)意图的信息:

 Bundle bundle = data.getExtras(); if (bundle != null) { for (String key : bundle.keySet()) { Object value = bundle.get(key); Log.d(TAG, String.format("%s %s (%s)", key, value.toString(), value.getClass().getName())); } } 

(确保在循环之前检查bundle是否为空)

这是我如何定义实用方法来转储一个意图的所有额外。

 import java.util.Iterator; import java.util.Set; import android.os.Bundle; public static void dumpIntent(Intent i){ Bundle bundle = i.getExtras(); if (bundle != null) { Set<String> keys = bundle.keySet(); Iterator<String> it = keys.iterator(); Log.e(LOG_TAG,"Dumping Intent start"); while (it.hasNext()) { String key = it.next(); Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]"); } Log.e(LOG_TAG,"Dumping Intent end"); } } 

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

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

它输出的东西类似于:

“#Intent; action = android.intent.action.MAIN; category = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; component = com.mydomain.myapp / .StartActivity; sourceBounds = 12%20870%20276%201167; l .profile = 0;结束“

在这个string的末尾(粗体的部分),你可以find额外的列表(在这个例子中只有一个额外的东西)。

这是根据toUri文档 :“URI包含Intent的数据作为基本的URI,附加的片段描述的动作,类别,types,标志,包,组件和额外的。

Bundle的get(String key)方法返回一个Object。 最好的办法是旋转每个键上调用get(String)的键集,并使用Object上的toString()来输出它们。 这对于原语来说是最好的,但是你可能会遇到没有实现toString()的对象的问题。

 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()); } } 
 Bundle extras = getIntent().getExtras(); Set<String> ks = extras.keySet(); Iterator<String> iterator = ks.iterator(); while (iterator.hasNext()) { Log.d("KEY", iterator.next()); } 

你可以使用for (String key : keys) { Object o = get(key); 返回一个Object,调用它的getClass().getName()来得到types,然后做一组if()方法来确定你应该调用哪一个方法获得价值?

我想要一种将意图内容输出到日志并能够轻松读取的方式,所以这是我想出来的。 我创build了一个LogUtil类,然后创build了LogUtildumpIntent()方法,并对其进行了一些修改。 这是所有的样子:

 public class LogUtil { private static final String TAG = "IntentDump"; public static void dumpIntent(Intent i){ Bundle bundle = i.getExtras(); if (bundle != null) { Set<String> keys = bundle.keySet(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("IntentDump \n\r"); stringBuilder.append("-------------------------------------------------------------\n\r"); for (String key : keys) { stringBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r"); } stringBuilder.append("-------------------------------------------------------------\n\r"); Log.i(TAG, stringBuilder.toString()); } } } 

希望这可以帮助别人!

对不起,如果这太冗长或太晚,但这是我能find工作完成的唯一途径。 最复杂的因素是java没有通过引用函数传递的事实,所以get — Extra方法需要返回一个默认值,并且不能修改一个布尔值来判断默认值是否被偶然返回,或者因为结果不好。 为了这个目的,让方法抛出一个exception比返回一个默认值更好。

我在这里find了我的信息: Android Intent文档 。

  //substitute your own intent here Intent intent = new Intent(); intent.putExtra("first", "hello"); intent.putExtra("second", 1); intent.putExtra("third", true); intent.putExtra("fourth", 1.01); // convert the set to a string array 

设置文档

  String[] anArray = {}; Set<String> extras1 = (Set<String>) intent.getExtras().keySet(); String[] extras = (String[]) extras1.toArray(anArray); // an arraylist to hold all of the strings // rather than putting strings in here, you could display them ArrayList<String> endResult = new ArrayList<String>(); for (int i=0; i<extras.length; i++) { //try using as a String String aString = intent.getStringExtra(extras[i]); // is a string, because the default return value for a non-string is null if (aString != null) { endResult.add(extras[i] + " : " + aString); } // not a string else { // try the next data type, int int anInt = intent.getIntExtra(extras[i], 0); // is the default value signifying that either it is not an int or that it happens to be 0 if (anInt == 0) { // is an int value that happens to be 0, the same as the default value if (intent.getIntExtra(extras[i], 1) != 1) { endResult.add(extras[i] + " : " + Integer.toString(anInt)); } // not an int value // try double (also works for float) else { double aDouble = intent.getDoubleExtra(extras[i], 0.0); // is the same as the default value, but does not necessarily mean that it is not double if (aDouble == 0.0) { // just happens that it was 0.0 and is a double if (intent.getDoubleExtra(extras[i], 1.0) != 1.0) { endResult.add(extras[i] + " : " + Double.toString(aDouble)); } // keep looking... else { // lastly check for boolean boolean aBool = intent.getBooleanExtra(extras[i], false); // same as default, but not necessarily not a bool (still could be a bool) if (aBool == false) { // it is a bool! if (intent.getBooleanExtra(extras[i], true) != true) { endResult.add(extras[i] + " : " + Boolean.toString(aBool)); } else { //well, the road ends here unless you want to add some more data types } } // it is a bool else { endResult.add(extras[i] + " : " + Boolean.toString(aBool)); } } } // is a double else { endResult.add(extras[i] + " : " + Double.toString(aDouble)); } } } // is an int value else { endResult.add(extras[i] + " : " + Integer.toString(anInt)); } } } // to display at the end for (int i=0; i<endResult.size(); i++) { Toast.makeText(this, endResult.get(i), Toast.LENGTH_SHORT).show(); } 

我注意到在Android源代码中,几乎所有的操作都会强制Bundle重新打开它的数据。 所以如果(像我一样)为了debugging目的需要经常这样做,下面的代码很快input:

 Bundle extras = getIntent().getExtras(); extras.isEmpty(); // unparcel System.out.println(extras); 

如果要debugging所有你想要的是一个string(OP的暗示,但没有明确指出),只需使用toString的额外Bundle

 intent.getExtras().toString() 

它返回一个string,如:

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

文档: Bundle.toString() (不幸的是默认的Object.toString() javadoc,因此在这里没用。)