每分钟如何更新小部件

4

有人能告诉我每分钟更新小部件的最佳方法吗?

现在我正在使用AppWidget内部的线程,但有时会出现错误“FAILED BINDER TRANSACTION !!!”。 在那个错误之后,我总是一直得到很多类似的错误,而且我再也不能改变我的小部件中的视图了。

谢谢


1
您不能从AppWidgetProvider或任何其他BroadcastReceiver安全地分叉线程。请不要这样做。 - CommonsWare
2个回答

5

与在AppWidget中使用线程相比,您最好使用AlarmManager来安排重复的AppWidget更新意图,以便您的代码可以适当地处理。

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

有许多示例在互联网上,应该解释了如何使用AlarmManager来引发您的AppWidget更新意图的细节。


1
它还有一个优点,即除非需要,否则可以将您的代码保持在RAM之外。 - CommonsWare

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直到下一分钟才会更新。


太好了!这将在系统时钟上触发更新,太棒了!非常感谢。 - fullmoon
我怎样才能获取指向“_tvTime”的指针?在小部件中,我只有一个“RemoteView”,它设置了“TextView”的文本。 - Mneckoee

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