关于android pendingIntent 传递Parcelable对象时数据丢失问题
16lz
2021-01-24
最近在做一个闹钟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 Parcelables { 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 toParcelable(byte[] bytes, Parcelable.Creator 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对象
更多相关文章
- pull解析和json编码
- Android微信分享---点击分享伤害了我且一闪而过~
- Android面试题目(10) 内存泄露
- Android(安卓)tips3
- 改变分隔条,基于数组的ListView
- Android按钮设置文字变色
- Android的GridView和ScrollView的嵌套
- android之数组排序
- android animator