android - java.lang.SecurityException : ! @Too many alarms (500) 从 pid 10790 uid 10206 注册

标签 android alarmmanager

我在使用警报管理器安排警报时收到此错误

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/

相关文章:

android - 在 OpenGL 中通过触摸分割自己的对象

android - 如何在没有 AlarmManager 的情况下使用 Android 的传感器批处理

java - alarmmanager 总是在重启后被清除吗?

android - 如何在android中为工作日设置闹钟

java - 如何设置来自应用程序的每天一次通知

Android setRepeating() 和 setInexactRepeating() 不触发

android - 想要在触摸事件中旋转 min3d 库的 3d 图像

android-listview - 按钮还是列表?

android - 将数据传递到广播接收器以获取 SMS 传送报告

java - 如何在按下按钮后延迟一行代码