如何解决为什么可序列化和可打包的附加内容未保留在PendingIntent中?
为了创建包含某些信息的精确警报,我尝试通过嵌套在Intent
中的PendingIntent
的额外数据传递简单的POJO。我将后者提供给AlertManager
服务类。
我尝试实现Serializable
,但在收到null
时遇到了PendingIntent
。然后,我尝试实现Parcelable
并添加所有需要的方法和成员,但最终还是获得了null
。
我成功地进行了变通,包括复制Parcelableutil
类found here并将编组的数据作为字节数组。出于某种原因,这行得通。
private void scheduleAlert(Element element) {
Intent intent = new Intent(this.context,ReminderReceiver.class);
// Serializes the element and puts it into the extra intent data.
// ---- TRY 1 (tried with Serializable & Parcelable)
intent.putExtra("extra key",element);
// --------
// ---- TRY 2
Bundle extras = new Bundle();
extras.putSerializable("extra key",element);
intent.putExtras(extras);
// --------
// ---- TRY 3
Bundle extras = new Bundle();
bundle.putParcelable("extra key",element);
intent.putExtras(extras);
// --------
// ---- WORKAROUND
byte[] bytes = Parcelableutil.marshall(element);
intent.putExtra("extra key",bytes);
// --------
PendingIntent pendingIntent = PendingIntent.getbroadcast(this.context,element.getRequestCode(),intent,0);
AlarmManager alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE);
long reminderPeriodMillis = element.getReminderPeriod() * 1000;
long firstAlarmMillis = SystemClock.elapsedRealtime() + reminderPeriodMillis;
// Creates the alarm.
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstAlarmMillis,pendingIntent);
}
可以在下面找到Element类。
public class Element implements Serializable,Parcelable {
private static final long serialVersionUID = 1L;
private String title;
private int reminderPeriod;
private int requestCode;
public Element(String title,int reminderPeriod,int requestCode) {
this.title = title;
this.reminderPeriod = reminderPeriod;
this.requestCode = requestCode;
}
public Element(Parcel in) {
this.title = in.readString();
this.reminderPeriod = in.readInt();
this.requestCode = in.readInt();
}
public static final Creator<Element> CREATOR = new Creator<Element>() {
@Override
public Element createFromParcel(Parcel source) {
return new Element(source);
}
@Override
public Element[] newArray(int size) {
return new Element[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writetoParcel(Parcel dest,int flags) {
dest.writeString(this.title);
dest.writeInt(this.reminderPeriod);
dest.writeInt(this.requestCode);
}
public String getTitle() {
return this.title;
}
public int getReminderPeriod() {
return this.reminderPeriod;
}
public int getRequestCode() {
return this.requestCode;
}
}
接收警报的代码:
@Override
public void onReceive(Context context,Intent intent) {
// TRY 1 (with Serializable)
Element element = (Element) intent.getSerializableExtra("extra key");
// --------
// TRY 1 (with Parcelable)
Element element = (Element) intent.getParcelableExtra("extra key");
// --------
// TRY 2
Bundle extras = intent.getExtras();
Element element = (Element) extras.getSerializable("extra key");
// --------
// TRY 3
Bundle extras = intent.getExtras();
Element element = extras.getParcelable("extra key");
// --------
// ---- WORKAROUND
Bundle bundle = intent.getExtras();
Parcel parcelIn = Parcelableutil.unmarshall(bundle.getByteArray("extra key"));
Element element = new Element(parcelIn);
// --------
// [...]
}
TL; DR :为什么我的数据没有保留为包裹和序列化附加信息,而是以附加字节数组形式传递而保留了?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。