【问题标题】:Widget stops updating after a few minutes小部件在几分钟后停止更新
【发布时间】:2013-04-02 05:53:27
【问题描述】:

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

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 似乎在这么多分钟后停止了...... 有谁知道发生了什么?谢谢

【问题讨论】:

标签: android timer widget textview handler


【解决方案1】:

由于应用小部件只是主屏幕进程托管的广播接收器,因此您必须使用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);
                    }
             ...

【讨论】:

  • 在我的情况下我能找到一种方法吗?或者也许是一个我可以解释为我自己的代码的例子
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 2010-09-13
  • 2016-05-18
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多