首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android AlarmManager RTC_WAKEUP不精确?

基础概念

AlarmManager 是 Android 系统提供的一个用于安排在将来某个时间执行任务的类。RTC_WAKEUPAlarmManager 的一种类型,表示闹钟在设备处于休眠状态时也能唤醒设备并执行任务。

优势

  • 定时任务:可以设置定时任务,在指定时间执行某些操作。
  • 唤醒设备:即使设备处于休眠状态,也能唤醒设备执行任务。
  • 灵活性:支持设置一次性任务和重复任务。

类型

  • ELAPSED_REALTIME:从系统启动后经过的时间来触发。
  • ELAPSED_REALTIME_WAKEUP:从系统启动后经过的时间来触发,并且唤醒设备。
  • RTC:从 1970 年 1 月 1 日 00:00:00 UTC 开始的时间来触发。
  • RTC_WAKEUP:从 1970 年 1 月 1 日 00:00:00 UTC 开始的时间来触发,并且唤醒设备。

应用场景

  • 定时提醒:如闹钟、日程提醒等。
  • 后台任务:如定时同步数据、定时清理缓存等。
  • 定时更新:如定时检查应用更新等。

问题:RTC_WAKEUP 不精确

原因

  1. 系统休眠:当设备处于休眠状态时,系统可能会延迟唤醒设备,导致闹钟不精确。
  2. Doze 模式:Android 6.0 引入了 Doze 模式,该模式下系统会对电池进行优化,可能会影响闹钟的精确性。
  3. AlarmManager 的限制AlarmManager 在某些情况下可能无法提供高精度的定时任务。

解决方法

  1. 使用 setAndAllowWhileIdlesetExactAndAllowWhileIdle
    • 这些方法可以在 Doze 模式下设置闹钟,但精度可能会有所降低。
    • 这些方法可以在 Doze 模式下设置闹钟,但精度可能会有所降低。
  • 使用 JobScheduler
    • JobScheduler 是 Android 5.0 引入的,用于执行后台任务,可以在特定条件下执行任务,适合处理定时任务。
    • JobScheduler 是 Android 5.0 引入的,用于执行后台任务,可以在特定条件下执行任务,适合处理定时任务。
  • 使用 WorkManager
    • WorkManager 是 Android Jetpack 的一部分,适用于需要保证执行的后台任务,支持定时任务和周期性任务。
    • WorkManager 是 Android Jetpack 的一部分,适用于需要保证执行的后台任务,支持定时任务和周期性任务。

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android开发笔记(五十)定时器AlarmManager

    Java中的定时器机制有现成的方案,就是Timer+TimerTask。其中TimerTask用来描述时刻到达后的事务处理,而Timer用来调度定时任务,如何时启动、间隔多久再次运行等等。 Timer的调度方法是schedule,主要有三个参数。第一个参数表示用来调度的定时任务,第二个参数表示延迟多久首次启动任务,第三个参数表示间隔多久再次启动任务。 public void schedule(TimerTask task, long delay, long period) 定时任务得自己写个继承自TimerTask的新类,并重写run方法填入具体的事务处理代码。调用Timer的schedule方法,定时任务便会按照调度设置按时启动;TimerTask不能直接设置运行的次数上限,一旦启动就会持续定时运行,除非对象销毁或者调用了TimerTask的cancel方法。调用cancel方法停止定时任务后,若想重启该定时任务,只能重新声明TimerTask对象,并且重新调用schedule方法。 Timer+TimerTask的实质是利用开启Thread来触发定时任务,所以TimerTask实际上运行于非UI线程,也就无法直接操作UI。若想在TimerTask中修改UI控件,得通过Handler发送消息来间接实现。

    01

    Android开发笔记(一百六十)休眠模式下的定时器控制

    定时器AlarmManager常常用于需要周期性处理的场合,比如闹钟提醒、任务轮询等等。并且定时器来源于系统服务,即使App已经不在运行了,也能收到定时器发出的广播而被唤醒。似此回光返照的神技,便遭到开发者的滥用,造成用户手机充斥着各种杀不光进程,就算通过手机安全工具一再地清理内存,只要定时设定的时刻到达,刚杀掉的流氓App就会死灰复燃。长此以往,手机的运行速度越来越慢,内存也越来越不够用了,更糟糕的是,电量消耗地越来越快。 Android手机越用越慢的毛病老大不掉,为此每次系统版本升级,Android都力图在稳定性、安全性上有所改善。针对定时器AlarmManager的滥用问题,Android从4.4开始,修改了setRepeating方法的运行规则。原本该方法可指定每隔固定时间就发送定时广播,但在Android4.4之后,操作系统为了节能省电,将会自动调整定时器唤醒的时间。比如原来调用setRepeating方法设定了每隔10秒发送广播,但App在实际运行过程中,很可能过了好几分钟才发送一次广播,这意味着该方法将不再保证每次工作都在开发者设置的时间开始。 正如博文《Android开发笔记(七十五)内存泄漏的处理》描述的那样,当时为了演示定时器发生内存泄漏的场景,并没有直接调用setRepeating方法,而是接力调用set方法。App每次收到定时广播之后,还得重新开始下一次的定时任务,如此方可兼容Android4.4之后的持续定时功能。下面是将setRepeating方法改为使用set方法实现的代码例子:

    02

    腾讯视频国际版(Android)电量测试方法研究与总结

    在2017年Google I/O大会上,Google发布了Google Play管理中心的新功能:Android vitals。当app在大量设备上运行时,Android vitals会收集与应用性能相关的各种匿名数据,比如:与app稳定性相关的数据、app启动时间、电量使用情况、渲染时间以及权限遭拒等等,这些数据会被分析整理后展示在Google Play管理中心的Android vitals dashboard中。Android vitals 中需要开发者重点关注的核心指标有:crash率、ANR率、excessive wakeups(过渡唤醒)、stuck wake locks(唤醒锁定卡住)。其他指标,需根据应用类型选择性关注(Android vitals中的指标总览见图1-1)。若app某些指标表现很差,会影响用户体验,并且会导致应用在Google Play商店中的等级很低、排名靠后(APP指标异常示例图见图1-2)。开发者可以通过分析Android vitals中提供的一些参照指标,采取相应的措施来优化app。

    03
    领券