在Android中将地图转换为捆绑

有一个简单的方法来转换一个地图到一个捆绑在android中没有明确的迭代?

为什么?

Firebase将返回一个通知地图getData() 。 我需要将数据传递给一个意图。 以前GCM给了我一个捆绑,所以我不需要担心这个。

我想一个很好的老式循环是最简单的方法:

  Bundle bundle = new Bundle(); for (Map.Entry<String, String> entry : getData().entrySet()) { bundle.putString(entry.getKey(), entry.getValue()); } 

在Firebase消息传递中遇到了同样的问题,并为其创建了kotlin扩展函数。 要点在这里 ,代码如下。 虽然我正在使用这种方法,但有一些注意事项:

  • 它并没有涵盖所有可以放在一个包中的类型
  • 它仍在发展中,尚未经过充分测试

考虑到这一点,请使用它作为指导,而不是一个明确的解决方案。 我将随着时间的推移而不断更新。

 import android.os.Bundle import android.os.IBinder import android.os.Parcelable import java.io.Serializable fun <V> Map<String, V>.toBundle(bundle: Bundle = Bundle()): Bundle = bundle.apply { forEach { val k = it.key val v = it.value when (v) { is IBinder -> putBinder(k, v) is Bundle -> putBundle(k, v) is Byte -> putByte(k, v) is ByteArray -> putByteArray(k, v) is Char -> putChar(k, v) is CharArray -> putCharArray(k, v) is CharSequence -> putCharSequence(k, v) is Float -> putFloat(k, v) is FloatArray -> putFloatArray(k, v) is Parcelable -> putParcelable(k, v) is Serializable -> putSerializable(k, v) is Short -> putShort(k, v) is ShortArray -> putShortArray(k, v) // is Size -> putSize(k, v) //api 21 // is SizeF -> putSizeF(k, v) //api 21 else -> throw IllegalArgumentException("$v is of a type that is not currently supported") // is Array<*> -> TODO() // is List<*> -> TODO() } } } 

您可以使用writeToParcel(Parcel out, int flags)生成一个类似有用的Parcel ,因为它是Bundle的父类,它作为RemoteMessage类的一部分轻易构建到Firebase框架中。 文档在这里 。

  private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)