根据条件更新Android小部件

3

我刚刚开始学习 Android 开发,并编写了一个应用程序来显示电池状态的详细信息。 现在我想把整个东西放到小部件中 - 然后就有了问题: 我真的需要在后台使用更新服务来监听 ACTION_BATTERY_CHANGED 意图吗? 我最初的想法是只在 AndroidManifest.xml 文件的 intent-filter 标记中加入一行 - 但显然没有那么简单。 如果 UpdateService 是正确的方法,我会这样做 - 但我只想确保什么是适当的解决方案。

3个回答

3
我真的需要一个后台更新服务来监听ACTION_BATTERY_CHANGED意图吗?
你不能使用在清单中注册的BroadcastReceiver来处理ACTION_BATTERY_CHANGED,只能通过registerReceiver()方法由活动或服务来注册。
如果您没有其他原因在内存中运行服务,则更好的方法是轮询。设置AlarmManager定期检查电池电量(可配置)。要检查电池电量,请为ACTION_BATTERY_CHANGED IntentFilter调用registerReceiver()而不使用BroadcastReceiver(第一个参数为null)。这将返回最后广播的ACTION_BATTERY_CHANGED意图,从中可以获取最近的充电水平。

2

我建议您定期轮询电池状态,例如每30分钟。为此,您可以在AppWidgetProviderInfo中指定一个值来设置updatePeriodMillis

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

通过重写您的AppWidgetProvideronUpdate方法,更新您的小部件。

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


谢谢你的回复,但是这将被限制在至少30分钟,因为这是updatePeriodMillis的最小值,不是吗? - DonGru
你说得对!这很有趣,因为这个限制并不是一直存在的(http://android.git.kernel.org/?p=platform/frameworks/base.git;a=commit;h=851da848e97d9a1ec23a89ff0e200c301f32d690) - Josef Pfleger
我认为它被引入是因为程序员使用它进行频繁更新(例如时钟小部件每秒更新一次),这对电池寿命可能不是一件好事。 - DonGru

1

信不信由你,以下代码是可行的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接