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)
对于那些只运行棒棒糖三星设备遇到此问题,您可能正在使用FLAG_CANCEL_CURRENT与您的PendingIntent秒。切换到FLAG_UPDATE_CURRENT(进行任何其他调整,如果需要的话),问题应消除。
我完全没有根据的猜测是,三星正在进行一些“优化”,FLAG_CANCEL_CURRENT即它们不会立即删除已取消的内容PendingIntent,而只是将其标记为删除,然后很少执行(或根本不执行?)。
编辑
我们发现,发生此问题的设备将处于损坏状态(填充为PendingIntents?),直到重新启动设备或重新安装应用为止。