2010-08-09 73 views
3

我刚刚开始使用android开发并编写了一个应用程序来显示有关电池状态的详细信息。 现在我想把整个东西放到一个小部件 - 这里是问题: 我真的需要在后台更新服务来侦听ACTION_BATTERY_CHANGED意图吗?我的第一个想法是在AndroidManifest.xml中将一行 行插入到widget的intet-filter标签中 - 但显然并不那么简单。 如果UpdateService是我会做正确的方式,使 - 但我只是想妥善解决是知道什么在条件下更新android小部件

回答

4

我真的需要在 后台更新服务来侦听 ACTION_BATTERY_CHANGED意图?

对于ACTION_BATTERY_CHANGED,您不能使用清单注册BroadcastReceiver。它只能通过registerReceiver()的活动或服务注册。

如果因为其他原因没有在内存中存储服务,更好的方法是轮询。设置一个AlarmManager以便经常检查电池电量(请配置好!)。要检查电池电量,请致电registerReceiver()以获取ACTION_BATTERY_CHANGEDIntentFilter而不需要BroadcastReceiver(第一个参数为null)。这将返回最后广播ACTION_BATTERY_CHANGEDIntent,您可以从中获得最新的收费级别。

+0

这听起来像什么,我一直在寻找 - 感谢很多 – DonGru 2010-08-10 10:05:11

+1

什么问题清单是什么?为什么它不起作用? – 2011-05-26 22:24:25

2

我建议你定期轮询电池状态,例如,每30分钟一次。要做到这一点,你可以简单地在你AppWidgetProviderInfo

<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:updatePeriodMillis="1800000" /> 

指定updatePeriodMillis值..和通过重写你的AppWidgetProvideronUpdate方法更新你的widget。

编辑:正如Martin指出的那样,30分钟实际上是您可以通过这种方式接收更新的最短时间间隔。

+0

感谢您的支持 - 但是这会限制在至少30分钟内,因为这是updatePeriodMillis的最小值,不是吗? – DonGru 2010-08-10 10:01:50

+0

你是对的!这很有趣,因为这个限制并不总是存在(http://android.git.kernel.org/?p=platform/frameworks/base.git;a=commit;h=851da848e97d9a1ec23a89ff0e200c301f32d690) – 2010-08-10 15:01:43

+0

我重新介绍了它的介绍因为程序员使用它来进行频繁的更新(就像时钟部件的每一秒钟一样) - 这对电池寿命来说可能不是一件好事 – DonGru 2010-08-11 08:01:12

1

信不信由你,下面的工作:

cont.getApplicationContext().registerReceiver(rec, filter); 
+0

简直不敢相信......但它起作用!有什么收获? – KalEl 2012-01-04 17:09:58