每1分钟更新Android小部件

11

我正在编写一个 Android 小部件,希望每 1-5 分钟更新一次以监视来自 Web 服务的数据,但我发现 android:updatePeriodMillis 不能小于 30 分钟。

那么,如何在小部件中实现这个结果呢?

2个回答

19

注册一个AlarmManager服务,每隔1分钟调用一次。

final Intent intent = new Intent(context, UpdateService.class);
final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0);
final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pending);
long interval = 1000*60;
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),interval, pending);

然而,向应用程序小部件推送更新是一项昂贵的操作。每分钟更新一次将强制你的“更新应用程序小部件”代码常驻内存,保持运行状态,并且这也会显著消耗电池。


2
我们应该把这段代码放在哪里?作为一个Android初学者,这并没有帮助我... - Virthuss
1
这个应该放在 onUpdate 方法里吗? - natsumiyu
2
这在 Android 6.0+ 上无法正常工作。 Doze 模式通常与 setRepeating() 不兼容。我尝试了一切,甚至每次闹钟响起时都使用 setExactAndAllowWhileIdle(),但它要么不响起,要么在我想要的1分钟之后太多次响起。 - Nikiforos

1
使用一个HandlersendMessageDelayed(..)发送一个消息或者postDelayed(..)一个Runner
new Handler().postDelayed( new Runnable() {
    public void run() { ... },
    60000 /* one minute */
);

1
这里接受的答案:http://stackoverflow.com/questions/5671984/android-substuting-the-click-with-a-timer/5672264#5672264 给出了一个使用Handler和postDelayed的很好的示例。 - Maximus
这假定你有不断运行的代码,将会更新应用程序部件。这要么是有缺陷的假设,要么是一个非常糟糕的想法。 - CommonsWare
1
如果用户指的是桌面小部件,例如android.appwidget类,则我同意Priyank的答案是正确的。但是,如果用户指的是自定义视图,例如来自android.widget类的某些内容,则意味着附加到Activity的View树,这是我的最初假设。(为什么他们要重载“widget”名称呢?) - Anm

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