1. 程式人生 > >關於android pendingIntent 傳遞Parcelable物件時資料丟失問題

關於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()); // 設定鬧鐘 // 當前版本為194.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物件