PendingIntent无法将可分配的数据传递给BoradcastReveiver

  • Post author:
  • Post category:其他




问题描述

Pendingintent无法将可分配的数据传递给BoradcastReveiver.

发出警报,Todo是一个Parcelable类,而todo是我在通知中需要的实例.

public static void setAlarm(@NonNull Context context, @NonNull Todo todo) {
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra("KEY_TODO", todo);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, todo.remindDate.getTime(), alarmIntent);
}

在BoradcastReveiver中,我无法获取可用的数据,使用getParcelableExtra获取的对象为空

public void onReceive(Context context, Intent intent) {
    Todo todo = intent.getParcelableExtra("KEY_TODO");
}



解决方案

手动将Parceable转换为byte []并将其放入Intent extra中,根据需要手动将其转换回Parcelable.

// inspired by https://stackoverflow.com/a/18000094/115145
public class Parcelables {
  public static byte[] toByteArray(Parcelable parcelable) {
    Parcel parcel=Parcel.obtain();
    parcelable.writeToParcel(parcel, 0);
    byte[] result=parcel.marshall();
    parcel.recycle();
    return(result);
  }
  public static <T> T toParcelable(byte[] bytes,
                                   Parcelable.Creator<T> creator) {
    Parcel parcel=Parcel.obtain();
    parcel.unmarshall(bytes, 0, bytes.length);
    parcel.setDataPosition(0);
    T result=creator.createFromParcel(parcel);
    parcel.recycle();
    return(result);
  }
}



相关参考

android – Pendingintent getbroadcast丢失了可分配的数据

https://m.jb51.cc/android/1071444.html



版权声明:本文为weixin_44008788原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。