我在使用警报管理器安排警报时收到此错误
am.setExact(AlarmManager.RTC_WAKEUP, timeMillis, pendingIntent);
错误如下
java.lang.SecurityException: !@Too many alarms (500) registered from pid 10790 uid 10206
at android.os.Parcel.readException(Parcel.java:1540)
at android.os.Parcel.readException(Parcel.java:1493)
at android.app.IAlarmManager$Stub$Proxy.set(IAlarmManager.java:206)
at android.app.AlarmManager.setImpl(AlarmManager.java:428)
at android.app.AlarmManager.setExact(AlarmManager.java:376)
为什么会出现这个错误以及我们如何解决它。
最佳答案
与评论所暗示的不同,这可能不是您的错。这在 3 月中旬的某个地方开始在我们的生产代码中发生,这只发生在最近才开始推出的带有 Lollipop 的三星上。
更新: 这个问题终于发生在我们可用的一部手机上。
就像@goncalossilva 所说的问题是由于使用了FLAG_CANCEL_CURRENT
,三星似乎对警报数量设置了500 个上限,而其他供应商没有这个限制。
当使用 FLAG_CANCEL_CURRENT
创建一个 PendingIntent
时,它将取消挂起的 Intent (显然)不会取消警报(也很明显),稍后如果您使用取消警报新的待处理 Intent 它不会取消警报(不太明显,因为 Intent.filterEquals
应该是 true
)。话虽如此,因为挂起的 Intent 被取消,旧警报实际上不会触发,所以不用担心通过切换 FLAG_UPDATE_CURRENT
引入错误。
关于更改为 FLAG_UPDATE_CURRENT
后需要重启设备,您不必重启,您只需要等待其中一个警报触发,以便您有一个新的插槽用于新闹钟。
您可以尝试使用此代码重现问题,然后更改为 FLAG_UPDATE_CURRENT
看看会发生什么。
您还应该运行 "adb shell dumpsys alarm"
以查看所有生成的警报
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
for (int i = 0; i<1000; i++)
{
Intent intent = new Intent("FOOFOOFOO");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(pendingIntent);
long firstTime = SystemClock.elapsedRealtime() + 1000;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, pendingIntent);
}
关于android - java.lang.SecurityException : ! @Too many alarms (500) 从 pid 10790 uid 10206 注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344971/