關於android pendingIntent 傳遞Parcelable物件時資料丟失問題
阿新 • • 發佈:2019-02-12
最近在做一個鬧鐘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> 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物件