微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么可序列化和可打包的附加内容未保留在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 举报,一经查实,本站将立刻删除。