补充下上一次的问题http://blog.csdn.net/fancylovejava/article/details/9862183
在做一个记事日程提醒的android软件
给每条记事设置闹钟当然是发送广播给广播接收器咯,可是问题就出现了,
我是在存了一条记事,然后给这条记事添加闹钟时间设置的时候判断一下是否为最近的时间闹铃,if true就发送广播,
这个广播是用PendingIntent.getBroadCast发送的(这个方法里面就已经包含了sendBroadCast方法了),
而在广播接收器里面接收到了广播后启动闹铃,我使用的是手机系统默认的闹铃,
Uri mediaUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
mMediaPlayer = MediaPlayer.create(context, mediaUri);
mMediaPlayer.setLooping(true);
获取到默认铃声,然后就start,stop控制了。。。。
然后闹铃响了,在广播接收器里启动一个activity哦,这个activity要设置成i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
否则会有错误提示,android报错蛮人性化的,根据这个错误提示我才解决的这个问题。
启动了activity之后呢,然后在这个activiyt中再发送广播给这个广播接收器咯,
Intent i = new Intent("test.notepadalarmreceiver");
Bundle bundle = new Bundle();
bundle.putParcelable("testnote", note2);
i.putExtra("testnotealarm", bundle);
PendingIntent pi = PendingIntent.getBroadcast(AlarmShowActivity.this, 0, i,0);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+d1-d2,pi);
部分代码贴出来,
可是问题又出现了,就是传过去的bundle对象,无法自动更新,广播接收器里面接收到的bundle对象里面的序列化之后的对象一直都是最开始
PendingIntent.getBroadcast(AlarmShowActivity.this, 0, i, 0);里面的数据,
google一下,找到了篇文章http://blog.csdn.net/dadoneo/article/details/8164058
里面说的bundle数据清理什么的跟我的情况很相似,
intent.setFlags(PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
他给出了这行代码,这个意思就是pendingintent更新当前的,并且只发射一次oneshot吧,
然后我贴在我项目里,运行了下,结果报错了,
java.lang.IllegalArgumentException: Can't use FLAG_RECEIVER_BOOT_UPGRADE here又一个人性化的错误提示,直接google错误提示
PendingIntent p=PendingIntent.getBroadcast(context, id, i,PendingIntent.FLAG_CANCEL_CURRENT);
按照上面的修改了下,以为大功告成了,结果还是报错了,都不懂意思。。。。。。
最终解决的是
PendingIntent pi = PendingIntent.getBroadcast(AlarmShowActivity.this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT| PendingIntent.FLAG_ONE_SHOT);
而不是在intent里面setflags这个PendingIntent.FLAG_UPDATE_CURRENT| PendingIntent.FLAG_ONE_SHOT
然后在广播接收器里面接收到的bundle数据对象确实不一样了,大功告成了,
ps:不过我还是不明白为什么我intent.getExtra()得到的bundle对象之后,bundle.clear(),intent.removeExtra()都没起作用,真心恼火啊,有人明白吗
请留言交流!!!谢谢