最近看4.0的DeskClock源码,看了几天以后想使用它的源码写一个定时开启飞行模式的程序,歇了两天最后运行程序的时候发现,当执行updateNotification()方法的时候程序报了android.os.BadParcelableException: ClassNotFoundException when unmarshalling : com....的异常。看了很多帖子,都不能解决我的问题,源码中Alarm.java实现了Parcelable接口,代码绝对不会写错的,而且我也去API文档中确认没有写错。
最后发现,Logcat中的出错信息中没有我定义的包名,双击错误信息却跳到了程序的AlarmReceiver.java中,这说明系统认为是我的AlarmReceiver.java在unmarshall Alarm对象的时候出错了。
在AndroidManifest.xml中AlarmReceiver的IntentFilter定义是:
<intent-filter>
<action android:name="com.android.deskclock.ALARM_ALERT" />
<action android:name="alarm_killed" />
</intent-filter>
而<action android:name="alarm_killed" />这个action同样会触发系统中的Clock程序,因为系统的Clock程序的AlarmReceiver同样可以接受这个Action。因此,我们只需要改一下这一个intent-filter就行,比如改为:
<intent-filter>
<action android:name="com.lefter.alarm.ALARM_ALERT" />
<action android:name="com.lefter.alarm.ALARM_KILLED" />
</intent-filter>
发送Intent的时候Action定义为"com.lefter.alarm.ALARM_KILLED",这样的话,就只有我们自己的AlarmReceiver可以对这个Action进行处理了。从而避免了系统的Clock与我们的程序产生冲突了。