我已经开发了我的android警报应用程序,它每小时需要进行一些操作(例如1 pm、2pm、3pm、4pm、5pm、6pm等)。

现在正在使用alarmManager,这样我每小时都会收到一次broadCast事件。但是有时该事件被延迟了。

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Log.d(Constants.APP_TAG, "setting beep alarm");
PendingIntent  pendingIntent = PendingIntent.getBroadcast( context, 0, new Intent("com.mindedges.beephourly.intent.action.NEW_HOUR"),PendingIntent.FLAG_UPDATE_CURRENT );

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, AlarmSheduleHelper.getImmediateNextHour().getTimeInMillis(),AlarmManager.INTERVAL_HOUR, pendingIntent);

我如何确保我能准时收到广播事件。

PS:在某些特定的手机/anroid版本上会延迟

最佳答案

在Android 6.0棉花糖中,Google引入了“打ze”模式。

在这里阅读更多关于它的信息:Optimizing for Doze and App Standby

和/或在这里观看:Android Marshmallow 6.0: Introduction to Doze Mode

在您的情况下,Google建议使用 setAndAllowWhileIdle 强制手机绕过打ze模式,而不是set(和 setExactAndAllowWhileIdle 而不是setExact)。

注意! 似乎没有setRepeating的类似物,因此您必须逐一安排 setExactAndAllowWhileIdle 来“手动”安排下一次重复。

对于具有Android 4.4 KitKat及更高版本的设备-考虑使用 setExact 而不是旧的set,因为操作系统会尝试转移警报,以最大程度地减少唤醒时间和电池消耗。

可能还有更多要注意的地方-例如,某些OEM可能预先安装了自己的utils,以节省电池生命周期,但至少它必须涵盖库存的Android以及大概大多数流行的设备。

关于Android警报事件被延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34306309/

10-11 22:31
查看更多