android - notification - google cloud messaging شرح




تحويل الخريطة إلى حزمة في الروبوت (3)

هل هناك طريقة سهلة لتحويل خريطة إلى حزمة في 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()
    }
  }
}

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






firebase-cloud-messaging