Too many alarms (500) registered

项目用了AlarmManager之后,出现了以下报错;


StackTrace=!@Too many alarms (500) registered from pid 5354 uid 10152java.lang.SecurityException: !@Too many alarms (500) registered from pid 5354 uid 10152
at android.os.Parcel.readException(Parcel.java:1546)
at android.os.Parcel.readException(Parcel.java:1499)
at android.app.IAlarmManager$Stub$Proxy.set(IAlarmManager.java:206)
at android.app.AlarmManager.setImpl(AlarmManager.java:428)
at android.app.AlarmManager.set(AlarmManager.java:215)

根据问题描述,主要的意思是说,你在AlarmManager中注册了太多闹钟,引起安全性问题了。


这个BUG基本都是在三星机器上出现,主要解决方法有:

1. 不要使用AlarmManager.setRepeating方法。

     setRepeating注册的闹钟会常驻在Android系统进程里,那怕应用进程被杀掉,闹钟也不会被取消。

     如果需要重复性的闹钟,可以在接到闹钟广播后,再重新启动一个闹钟,自己模拟setRepeating。

2. 通常设置闹钟的代码如下

 Intent intent = new Intent("com.matt.example.action.alarm");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);             
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);


       PendingIntent.getBroadcast的第2个参数requestCode可以用来区分不同的闹钟。建议同一个功能使用的闹钟(假设你应用里有多个功能都用到闹钟),其requestCode应当是一个常量,不应该是一个变化的值。如果是一个变化的值,应用被杀死后重启,同一个功能就可能有多个闹钟。


       PendingIntent.getBroadcast的第4个参数flags,建议用PendingIntent.FLAG_UPDATE_CURRENT,否则应用被杀死重启,也可能有多个相同闹钟。


最后,修改后覆盖安装,你可能会发现还有这个crash。relax, 这不是你的错。重启手机即可。因为覆盖安装,旧版本注册的闹钟还是在的,只有重启手机才会清空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值