I have weird problem woke me up full night, any extra data put in intent in Broadcast, I don't find it later in the Broadcast receiver here is alarming class ( sender)
private class Alarming {
private AlarmManager alarmManager;
private Intent intent;
private PendingIntent pendingIntent;
Alarming() {
intent = new Intent(TimetableActivity.this, SessionAlarm.class);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
}
public void setSessionAlarm(FiredAlarm firedAlarm) {
/*
we will correct day of month if needed, so we roll elapsed date
to avoid instant alarming.
*/
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(firedAlarm.getDateInMillis());
Calendar now = Calendar.getInstance();
if (calendar.before(now)) {//if session date is before today
calendar.set(Calendar.YEAR, now.get(Calendar.YEAR));
calendar.set(Calendar.WEEK_OF_YEAR, now.get(Calendar.WEEK_OF_YEAR));
}
firedAlarm.setDateInMillis(calendar.getTimeInMillis());
Bundle args = new Bundle();
args.putParcelable(FIRED_ALARM_KEY, firedAlarm);
intent.putExtras(args);
intent.putExtra("INT", 54);
pendingIntent =
PendingIntent.getBroadcast(TimetableActivity.this, firedAlarm.getRequestedCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
firedAlarm.getDateInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES / 5, pendingIntent);
}
}
and here is the broadcast receiver, intent can't receive any kinds of data, primitive, bundle, parcelable...etc
public class SessionAlarm extends BroadcastReceiver {
private static final String TAG = "session_alarm_tag";
public static final String FIRED_ALARM_KEY = "fired_alarm_key";
FiredAlarm firedAlarm;
int requestCode;
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, " Received Integer : " + intent.getIntExtra("INT", -1));
Bundle bundle = intent.getExtras();
firedAlarm = bundle.getParcelable(FIRED_ALARM_KEY);
if (firedAlarm != null) {
//TODO Blabla...
} else Log.i("onReceive", "no parcelable fired alarm found!");
}
private void createNotification(Context context, FiredAlarm firedAlarm) {
//TODO
}
Here is FiredAlarm class :
public class FiredAlarm implements Parcelable {
private int requestedCode;
private long dateInMillis;
private String classroom;
private int duration;
public String getClassroom() {
return classroom;
}
public void setClassroom(String classroom) {
this.classroom = classroom;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public FiredAlarm(int requestedCode, long dateInMillis) {
this.requestedCode = requestedCode;
this.dateInMillis = dateInMillis;
}
public void setRequestedCode(int requestedCode) {
this.requestedCode = requestedCode;
}
public void setDateInMillis(long dateInMillis) {
this.dateInMillis = dateInMillis;
}
public int getRequestedCode() {
return requestedCode;
}
public long getDateInMillis() {
return dateInMillis;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.requestedCode);
dest.writeLong(this.dateInMillis);
dest.writeString(this.classroom);
dest.writeInt(this.duration);
}
public void readFromParcel(Parcel source) {
this.requestedCode = source.readInt();
this.dateInMillis = source.readLong();
this.classroom = source.readString();
this.duration = source.readInt();
}
protected FiredAlarm(Parcel in) {
this.requestedCode = in.readInt();
this.dateInMillis = in.readLong();
this.classroom = in.readString();
this.duration = in.readInt();
}
public static final Parcelable.Creator<FiredAlarm> CREATOR = new Parcelable.Creator<FiredAlarm>() {
@Override
public FiredAlarm createFromParcel(Parcel source) {
return new FiredAlarm(source);
}
@Override
public FiredAlarm[] newArray(int size) {
return new FiredAlarm[size];
}
};
}
I always get negative result, no data, is it really a bug on new SDK 30 level or what?