如何每分钟更新小部件

时间:2010-10-06 12:14:13

标签: android android-widget

任何人都可以告诉我每分钟更新小部件的最佳方式。

现在我在AppWidget中使用线程,但有时我得到错误FAILED BINDER TRANSACTION !!!在那个错误之后,我总是会遇到很多错误,而且我无法再次更改我的小部件中的视图。

由于

2 个答案:

答案 0 :(得分:5)

不是在AppWidget中使用线程,而是使用AlarmManager来安排代码可以正确处理的重复AppWidget更新意图,从而提供更好的服务。

这种方法的好处是可以配置更新速率,还可以处理设备休眠的情况(而不是唤醒以运行代码,甚至因为线程繁忙而被阻止睡眠)。 / p>

互联网上有很多examples,应该解释使用AlarmManager提升AppWidget更新意图的细节。

答案 1 :(得分:2)

系统根据系统时钟在每分钟的确切开始发送广播事件。使用您的小部件创建服务并执行以下操作:

BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;

@Override
public void onStart() {
    super.onStart();
    _broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context ctx, Intent intent) {
                if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
                    _tvTime.setText(_sdfWatchTime.format(new Date()));
            }
        };

    registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}

@Override
public void onStop() {
    super.onStop();
    if (_broadcastReceiver != null)
        unregisterReceiver(_broadcastReceiver);
}

不要忘记事先初始化TextView(到当前系统时间),因为很可能你会在一分钟内弹出你的UI,而TextView在下一分钟发生之前不会更新。