首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP

安卓AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
EN

Stack Overflow用户
提问于 2011-05-09 22:22:38
回答 5查看 61.9K关注 0票数 87

有人能给我解释一下AlarmManager.RTC_WAKEUPAlarmManager.ELAPSED_REALTIME_WAKEUP之间的区别吗?我已经阅读了文档,但仍然不能真正理解使用一个而不是另一个的含义。

示例代码:

代码语言:javascript
复制
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                     scheduledAlarmTime, 
                     pendingIntent);

    alarmManager.set(AlarmManager.RTC_WAKEUP, 
                     scheduledAlarmTime, 
                     pendingIntent);

这两行代码的执行有什么不同?这两行代码什么时候才能相对执行呢?

我很感谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-09 22:44:15

AlarmManager.ELAPSED_REALTIME_WAKEUP类型用于从开机开始触发告警:

代码语言:javascript
复制
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 600000, pendingIntent);

实际上会在设备启动后10分钟使警报从响起。

有一个计时器在设备启动时开始运行,以测量设备的正常运行时间,这是根据设备的正常运行时间触发警报的类型。

AlarmManager.RTC_WAKEUP会根据时钟的时间触发告警。例如,如果您这样做:

代码语言:javascript
复制
long thirtySecondsFromNow = System.currentTimeMillis() + 30 * 1000;
alarmManager.set(AlarmManager.RTC_WAKEUP, thirtySecondsFromNow , pendingIntent);

另一方面,这将在now 30秒后触发警报

AlarmManager.RTC_WAKEUP相比,AlarmManager.ELAPSED_REALTIME_WAKEUP类型很少使用。

票数 148
EN

Stack Overflow用户

发布于 2013-03-14 10:17:11

尽管目前已被接受并获得了更高票数的答案,但对于警报和计时,AlarmManager.ELAPSED_REALTIME*类型和SystemClock.elapsedRealtime()始终比RTC时钟更可靠。

将ELAPSED_REALTIME_WAKEUP与AlarmManager一起使用将依赖于从启动时间开始的单调时钟“,并且即使在中央处理器处于省电模式时也会继续滴答作响,因此是通用时间间隔计时的推荐基础”。所以,

代码语言:javascript
复制
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
                 + 60*1000, pendingIntent);

会让你的PendingIntent在1分钟内触发(60*1000毫秒)。

然而,AlarmManager.RTC_WAKEUP表示标准的“墙”时间,以毫秒为单位。所以,

代码语言:javascript
复制
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                 + 60*10000, pendingIntent);

也可能在60秒后触发警报,但不可靠,因为如SystemClock documentation中所述

挂钟可以由用户或电话网络设置(请参阅setCurrentTimeMillis(

)),因此时间可能会不可预测地向后或向前跳跃。仅当与真实日期和时间的对应关系很重要时,才应使用此时钟,例如在日历或闹钟应用程序中。间隔或已用时间测量应使用不同的时钟。如果您正在使用System.currentTimeMillis(),请考虑收听ACTION_TIME_TICK、ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED意图广播,以了解时间何时发生变化。

此外,该问题仅引用了*_WAKEUP警报,但也请参阅AlarmManager文档,以确保您了解唤醒与非唤醒警报提供了什么。

票数 110
EN

Stack Overflow用户

发布于 2012-01-25 23:51:01

只是一张纸条。你可以得到的正常运行时间米利斯调用:

代码语言:javascript
复制
long uptimeMillis =  SystemClock.elapsedRealtime();

因此,如果您想在30秒后触发警报,并且想要使用正常时钟而不是正常时钟,您可以这样做:

代码语言:javascript
复制
long thirtySecondsFromNow =  SystemClock.elapsedRealtime() + 30 * 1000;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, thirtySecondsFromNow, pendingIntent);

每当您想要检查某个运行时间而不是特定的日期/时间时,最好使用正常运行时间。这是因为用户在设备中设置的当前时间可以更改,如果用户使用这些设置进行更改的话。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5938213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档