为什么可序列化和可打包的附加内容未保留在PendingIntent中?

问题描述

为了创建包含某些信息的精确警报,我尝试通过嵌套在Intent中的PendingIntent的额外数据传递简单的POJO。我将后者提供给AlertManager服务类。

我尝试实现Serializable,但在收到null时遇到了PendingIntent。然后,我尝试实现Parcelable添加所有需要的方法和成员,但最终还是获得了null

我成功地进行了变通,包括复制Parcelableutilfound 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...