0
点赞
收藏
分享

微信扫一扫

关于android pendingIntent 传递Parcelable对象时数据丢失问题


最近在做一个闹钟app时发现,利用pendingIntent 传递Parcelable对象,在broadcast里面无法获取到对应的Parcelable对象。

//发送pengingIntent
Intent intent = new Intent(context, AlarmClockBroadcast.class);
intent.putExtra(AlarmClockCommon.ALARM_CLOCK, alarmClock);
PendingIntent pi = PendingIntent.getBroadcast(context,
alarmClock.getId(), intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);

// 取得下次响铃时间
long nextTime = calculateNextTime(alarmClock.getHour(),
alarmClock.getMinute(), alarmClock.getWeeks());
// 设置闹钟
// 当前版本为19(4.4)或以上使用精准闹钟
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, nextTime, pi);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, nextTime, pi);
}

//广播接收
AlarmClock alarmClock = intent
.getParcelableExtra(WeacConstants.ALARM_CLOCK);

这里获取到的alarmClock对象为空

原因是在6.0版本以上pendingIntent在这个过程中可能丢失了Parcelable对象
解决办法:

public class ParcelablesUtils {
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);
}
}

通过将Parcelable对象先转化成byte数组传递,然后在broadcast中获取到这个byte数组,再将其转化成Parcelable对象
 

发送:

intent.putExtra(ALARM_CLOCK, ParcelablesUtil.toByteArray(alarmClock));

接收:

@Override
public void onReceive(Context context, Intent intent) {

byte[] acByte = intent.getByteArrayExtra(ALARM_CLOCK);
if (acByte != null) {
MyAlarmClock alarmClock = ParcelablesUtil.toParcelable(acByte, MyAlarmClock.CREATOR);
}

举报

相关推荐

0 条评论