过多唤醒源

1.过多的唤醒源wakeups

Wakeups 是 AlarmManager API 中的一种机制 ,它可让开发人员在指定时间设置警报,进而达到唤醒设备的目的。

您的应用通过使用 RTC_WAKEUP_MASK (设备在进入到idle状态的时候设备会被唤醒 执行)

或ELAPSED_REALTIME_WAKEUP_MASK (SystemClock.elapsedRealtime()进行时间设置,并且设备在进入到idle状态的时候会被执行;)

以下标志标明不会执行:

RTC_MASK = 1;通过System.currentTimeMillis()进行时间设置,并且设备在进入到idle状态的时候不会被执行

ELAPSED_REALTIME_MASK = 3;通过SystemClock.elapsedRealtime()进行时间设置,并且设备在进入到idle状态的时候不会被执行。

即 四种标志 两种是按开机到现在的时间标准设置 两种是按系统时钟标准设置,

两种在休眠状态会退出休眠 执行任务 两种不能,

其他标志:

(1)FLAG_STANDALONE = 1;用于标识该alarm不会被加入到其他alarm集合中去(在Android4.4以上是非准确传递的,对时间相近的alarm会进行批处理),单独进行处理;

(2)FLAG_WAKE_FROM_IDLE = 2;用于标识设备即使处于idle状态,也会被唤醒处理alarm;

(3)FLAG_ALLOW_WHILE_IDLE = 4;用于标识设备即使处于idle状态也会处理alarm,并且设备不会退出idle状态;

(4)FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED = 8;类似于3,但是它的运行不会受到任何约束,仅适用于系统alarm;

(5)FLAG_IDLE_UNTIL = 16;仅适用于系统,用于告诉AlarmManager在什么时候退出idle模式,也就是只能在DeviceIdleController使用,

当DeviceIdleController设置该flag的时候,说明系统已经进入到了idle状态;

标志调用AlarmManager中的set()方法来设置唤醒警报。当触发唤醒警报后,设备将退出低功耗模式,并在执行警报

onReceive()或 onAlarm() 方法的同时hold spartial wake lock 。如果唤醒警报触发过多,它们可能会耗尽设备的电池电量。

为了帮助您提高应用程序质量,Android会自动监视应用程序是否存在过多的唤醒警报,并以Android vitals的形式显示信息。

有关如何收集数据的信息,请参阅Play控制台文档。

如果您的应用过度唤醒设备,则可以使用此页面中的指导来诊断和解决问题。

  1. 如何fix 过多唤醒源问题

AlarmManager 是在Android平台的早期版本中推出的,但随着时间的推移,以前需要很多 AlarmManager 的用例现在更好新功能

提供服务(比如:WorkManager)。本部分包含有关减少唤醒警报的提示,但从长远来看,请考虑迁移您的应用以遵循第三节最佳实践部分中的建议。

确定您在应用中安排唤醒警报的位置,并减少触发这些警报的频率。这里有一些提示:

•查找对包含RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 标志的各种 AlarmManager set() 方法的调用 。

•我们建议您将包,类或方法的名称包括在警报的标记名称中,以便您可以轻松地在源中识别设置警报的位置。以下是一些其他提示:

◾忽略名称中的任何个人身份信息(PII),例如电子邮件地址。否则,设备将记录日志_UNKNOWN而不是警报名称。

◾不要以编程方式获取类或方法的名称,例如通过调用 getName() ,因为Proguard可能会混淆它们。而是使用硬编码的字符串。

◾不要在警报标签中添加计数器或唯一标识符。系统将无法聚合以这种方式设置的警报,因为它们都具有唯一的标识符。

解决问题后,通过运行以下ADB 命令来验证唤醒警报是否按预期工作:

adb shell dumpsys alarm

仅当您的应用需要执行面向用户的操作(例如发布通知或提醒用户)时,才使用唤醒警报。有关AlarmManager最佳做法的列表,请参阅Scheduing Repeating Alarms。

不要 AlarmManager

用于安排后台任务,尤其是重复的或网络后台任务。建议使用 WorkManager 执行后台任务,因为它具有以下优点:

•批处理-合并作业,以减少电池消耗

•持久性-如果重新启动设备,则在重新启动完成后运行计划的WorkManager作业

•条件-作业可以根据条件运行,例如设备是否正在充电或WiFi是否可用

有关更多信息,请参阅《后台处理指南》。

不要 AlarmManager 用于安排仅在应用程序运行时才有效的计时操作(换句话说,当用户退出应用程序时应取消计时操作)。在这种情况下,请使用 Handler 该类,因为它更易于使用且效率更高。

发布了81 篇原创文章 · 获赞 0 · 访问量 1311

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/104044737