java.lang.SecurityException:!@Too从pid 10790 uid 10206注册的许多警报(500)

Man*_*til 32 android alarmmanager

我在使用Alarm Manager进行计划警报时收到此错误

am.setExact(AlarmManager.RTC_WAKEUP, timeMillis, pendingIntent);
Run Code Online (Sandbox Code Playgroud)

错误如下

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)
Run Code Online (Sandbox Code Playgroud)

为什么会出现这个错误以及我们如何解决它.

小智 44

与评论所暗示的不同,这可能不是你的错.3月中旬开始在我们的生产代码中开始发生这种情况,这种情况只发生在三星和Lollipop上,而Lollipop最近才开始推出.

更新:此问题最终发生在我们提供的其中一部手机上.

就像@goncalossilva所说的问题是由于使用FLAG_CANCEL_CURRENT,似乎三星在报警量上引入了500的上限而没有其他供应商有这个限制.

当创建一个PendingIntentwith时FLAG_CANCEL_CURRENT它会取消挂起的意图(显然)不会取消警报(也很明显),以后如果你使用新的待定意图取消警报它将不会取消警报(不太明显Intent.filterEquals应该是true).话虽这么说,因为待处理的意图被取消了,旧的警报实际上不会触发,所以不用担心通过切换引入错误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);
    } 
Run Code Online (Sandbox Code Playgroud)

  • 我想借此机会感谢三星让我们开发人员的生活更轻松,更简单.谢谢! (11认同)
  • 这也是我们在生产中发生的,最近才开始,我们没有任何改变.只有三星设备,大多数(> 95%)在棒棒糖上. (5认同)
  • 使用`adb shell dumpsys alarm`我发现我们的应用程序一直在泄漏警报,在此之前它是不可见的.将FLAG_CANCEL_CURRENT更改为FLAG_UPDATE_CURRENT并确保PendingIntents相同(将其创建提取为常用方法)为我们解决了这个问题. (3认同)
  • 关于这个的任何消息?我也有这个问题,但我一直使用和使用UPDATE_CURRENT. (3认同)

gon*_*lva 5

对于那些只运行棒棒糖三星设备遇到此问题,您可能正在使用FLAG_CANCEL_CURRENT与您的PendingIntent秒。切换到FLAG_UPDATE_CURRENT(进行任何其他调整,如果需要的话),问题应消除。

我完全没有根据的猜测是,三星正在进行一些“优化”,FLAG_CANCEL_CURRENT即它们不会立即删除已取消的内容PendingIntent,而只是将其标记为删除,然后很少执行(或根本不执行?)。

编辑

我们发现,发生此问题的设备将处于损坏状态(填充为PendingIntents?),直到重新启动设备或重新安装应用为止。

  • 我使用FLAG_UPDATE_CURRENT,它也会发生。 (5认同)