AlarmManager使用心得
最近在做的项目,对于性能和功耗的优化非常重视。由此,也学习到了很多AlarmManager好用的用法。
基于此,我也对AlarmManager的内容产生了一些兴趣。去了android官网上查阅了AlarmManager相关资料,对比项目上实践过的内容,加深印象。
总的来说setExactAndAllowWhileIdle 是比 setAndAllowWhileIdle 要准时。
查阅官网时,发现AlarmManager没有中文翻译。所以机翻了一下,以便阅读。
此类提供对系统警报服务的访问。 这些使您可以安排应用程序在将来的某个时间运行。
警报响起时,系统会广播已为其注册的Intent,并在目标应用程序尚未运行时自动启动它。
设备处于睡眠状态时会保留已注册的警报(如果警报在这段时间内关闭,可以选择将其唤醒),但是如果将其关闭并重新启动,则将被清除。只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁。 这样可以确保手机在完成广播处理之前不会进入睡眠状态。
一旦onReceive()返回,警报管理器将释放此唤醒锁。 这意味着在某些情况下,一旦onReceive()方法完成,电话就会进入休眠状态。
如果您的警报接收器称为Context.startService(),则手机可能会在启动请求的服务之前进入睡眠状态。
为避免这种情况,您的BroadcastReceiver和服务将需要实施单独的唤醒锁定策略,以确保电话继续运行,直到服务可用为止。警报管理器适用于希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。
对于正常的计时操作(滴答声,超时等),使用Handler会更容易且效率更高。
从API
19(Build.VERSION_CODES.KITKAT)开始,警报传递是不精确的:操作系统将转移警报,以最大程度地减少唤醒和电池消耗。这里有新的API支持需要严格传递保证的应用;
请参见setWindow(int,long,long,android.app.PendingIntent)和setExact(int,long,android.app.PendingIntent)。
Summary Nested classes class AlarmManager.AlarmClockInfo An immutable
description of a scheduled “alarm clock” event.
interface AlarmManager.OnAlarmListener
直接通知警报:从设置警报到传递警报,请求者必须连续运行,否则传递失败.
String ACTION_NEXT_ALARM_CLOCK_CHANGED Broadcast Action: Sent after
the value returned by getNextAlarmClock() has changed.
int ELAPSED_REALTIME
SystemClock.elapsedRealtime()中的警报时间(自启动以来的时间,包括睡眠)。 此警报不会唤醒设备;
如果设备在睡眠状态下熄灭,则将在下次设备唤醒时将其交付。
int ELAPSED_REALTIME_WAKEUP
SystemClock.elapsedRealtime()中的警报时间(自启动以来的时间,包括睡眠),它将在设备关闭时将其唤醒。
long INTERVAL_DAY 在API
19之前的Android上运行时,setInexactRepeating(int,long,long,android.app.PendingIntent)可以识别的可用不精确重复间隔。
long INTERVAL_FIFTEEN_MINUTES 在API
19之前的Android上运行时,setInexactRepeating(int,long,long,android.app.PendingIntent)可以识别的可用不精确重复间隔。
long INTERVAL_HALF_DAY 在API
19之前的Android上运行时,setInexactRepeating(int,long,long,android.app.PendingIntent)可以识别的可用不精确重复间隔。
long INTERVAL_HALF_HOUR 在API
19之前的Android上运行时,setInexactRepeating(int,long,long,android.app.PendingIntent)可以识别的可用不精确重复间隔。
long INTERVAL_HOUR 在API
19之前的Android上运行时,setInexactRepeating(int,long,long,android.app.PendingIntent)可以识别的可用不精确重复间隔。
int RTC System#currentTimeMillis中的警报时间(UTC中的挂钟时间)。 此警报不会唤醒设备;
如果设备在睡眠状态下熄灭,则将在下次设备唤醒时将其交付。
int RTC_WAKEUP
System#currentTimeMillis中的警报时间(UTC中的挂钟时间),在设备关闭时将唤醒设