1

我正在开发一个显示时间和日期的小部件,使用两个TextView使用 atimer每秒更新一次:

final Handler handler = new Handler();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {

            handler.post(new Runnable() {
                    public void run() {
                        java.util.Date noteTS = Calendar.getInstance().getTime();
                        String time = "kk:mm";
                        String date = "dd MMMMM yyyy";

                        views.setTextViewText(R.id.tvTime, DateFormat.format(time, noteTS));
                        views.setTextViewText(R.id.tvDate, DateFormat.format(date, noteTS));
                        appWidgetManager.updateAppWidget(appWidgetId, views);
                    }
            });
    }
}, 0, 1000);// Update textview every second

添加时它会更新小部件,但会在几分钟后停止。在我重新启动后它也很难加载,但主要问题是timer这么多分钟后似乎停止了......有人知道发生了什么吗?谢谢

4

1 回答 1

0

由于应用小部件只是主屏幕进程托管的广播接收器,因此您必须使用它AlarmManager来安排对小部件的调用。如果不只是为了测试,请注意您的电池会耗尽,因为设备永远不会进入睡眠状态。通常,每秒更新应用程序小部件并不是一个好主意。

可以类似于此代码完成(此处为一分钟唤醒)

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MyWidget.ACTION_MYACTION);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
long triggerAtTime = getNextOccurrence(1); // next minute
am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pi);

static private long getNextOccurrence(int deltaMinutes)
    {
            Calendar calendar = Calendar.getInstance();
            long now = calendar.getTimeInMillis();
            long then = now + (deltaMinutes * 60 * 1000);
            return then;
    }

OnReceive

public void onReceive(Context context, Intent intent)
    {
            Log.d(TAG, "onReceive() " + intent.getAction());
            super.onReceive(context, intent);

            if (intent != null)
            {
                    if (ACTION_MYACTION.equals(intent.getAction())
                    {
                            updateWidgets(context);
                    }
             ...
于 2013-04-01T20:52:23.810 回答