每 n 秒检索一次 Android 电池指标 [高效]

Posted

技术标签:

【中文标题】每 n 秒检索一次 Android 电池指标 [高效]【英文标题】:Retrieving Android Battery Metrics Every n Seconds [Efficiently] 【发布时间】:2012-06-25 23:11:50 【问题描述】:

我找到了许多用于监控电池电量的来源,但没有一个描述如何以固定的时间间隔进行检查。假设我想每 n 秒检查一次电池。最有效的方法是什么?

目前,我创建了一个 BroadcastReceiver 并使用过滤器将其注册到我的服务中。然后我使用 ScheduledExecutor 从电池中“获取”信息。如果我正确理解发生了什么,我制作的 BroadcastReceiver 会从电池接收所有广播,而不是在它们进入时以动态速率接收所有广播,而不是我想要检查的恒定速率。

似乎当我创建广播接收器时,它会收到一条带有当前信息的“初始”消息。每隔一段时间创建一个接收器对象,接收这个初始消息,然后每次我想检查它时销毁它会更有效吗?或者,有没有我没有想到的其他方式?

我用来监控电池的来源,如果有人感兴趣的话:

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html http://developer.android.com/reference/android/os/BatteryManager.html Android Battery in SDK

【问题讨论】:

收听 ACTION_BATTERY_CHANGED 广播的重点不只是被通知电池电量水平的变化吗?每两分钟计算一次费用是否仍然相同有什么意义? 是的,正确的。如果我想每 5 分钟检查一次电池并且 BroadcastReceiver 每分钟都在接收一些东西,那么每 5 分钟检查一次不是更好吗?这些数字是任意的,但关键是广播接收器可以不断地监听更多的消息。即使在我的具体实现中并没有更好,我仍然很好奇是否有更好的方法来检查。 【参考方案1】:

假设我想每隔 n 秒检查一次电池。最有效的方法是什么?

除非n 以数百或数千秒为单位衡量,否则您很可能是电池寿命的第一消费者。鉴于您的评论,我会假设您的意思是“每 n 分钟”。

第 1 步:设置一个 AlarmManager 计划以每 n 分钟调用一次 IntentService(最好不要使用 _WAKEUP 警报类型)。

步骤#2:在IntentService 中,调用registerReceiver() 并使用null BroadcastReceiverIntentFilter 用于ACTION_BATTERY_CHANGED。返回值将是此事件的最后一次Intent 广播。

第 3 步:处理数据。

【讨论】:

使用不精确的重复警报,以便您的活动可以与其他活动相结合,无论如何系统都会为此唤醒。 好的,在阅读了 registerReceiver 的文档之后,这是有道理的。谢谢!只是检查一下:将它放在我已经拥有的 ScheduledExecutorService 上的 run 方法中,而不是创建一个新的警报管理器,对吗? (当我获得足够的声望时,我会记得投票!-我把这个放在这里是为了提醒我。) 启动一个在后台运行并且大部分时间都处于休眠状态的线程不是更有效吗?与让操作系统管理计时器并回调应用程序代码相比,让线程定期唤醒并检查电池寿命似乎更少开销。 @goldenfib:“将它放在我已经拥有的 ScheduledExecutorService 上的 run 方法中,而不是创建一个新的警报管理器,对吗?” -- 仅当您希望您的用户使用任务杀手和强制关闭来攻击您时(更不用说 Play 商店的后续评级)。请不要在没有充分理由的情况下一直运行服务。这就是为什么我说要使用IntentService,这样服务就可以在电池检查之间停止。 @aroth:效率有很多指标。您的解决方案需要不断运行的服务,这会不断占用 RAM。用户对任务杀手、设置中的强制关闭以及无数博客文章/cmets 进行了投票,他们通常不喜欢永久的服务。那么问题就变成了:您节省的电池是否值得您的一部分用户不喜欢您的应用程序的行为?

以上是关于每 n 秒检索一次 Android 电池指标 [高效]的主要内容,如果未能解决你的问题,请参考以下文章

每 n 秒复制一次

如何每隔N秒检查一次android中的Internet连接

电池高效的 android 小部件,每分钟更新一次

安卓gps检索

Android - 每 5 秒循环一次部分代码

如何允许用户每“n”秒刷新一次表?