在AppWidgetProvider中没有onUpdate

时间:2014-02-20 14:00:56

标签: java android-widget

我的Android小部件未更新日期。

这是一个只有日期的小部件,不再有。

package com.android.widget;

import java.util.Timer;
import java.util.TimerTask;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;

public class MyCalendarWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
                1000);
    }

    private class MyTime extends TimerTask {
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        ComponentName thisWidget;
        Fecha fec = new Fecha();

        public MyTime(Context context, AppWidgetManager appWidgetManager) {
            this.appWidgetManager = appWidgetManager;
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
            thisWidget = new ComponentName(context, MyCalendarWidget.class);
        }

        @Override
        public void run() {
            remoteViews.setTextViewText(R.id.widget_textview, fec.DiaActual(false)+"\r\n"
                                                             +fec.DiaActual(true) +" de "
                                                             +fec.MesActual(false)+" de "
                                                             +fec.AñoActualNumerico());
            appWidgetManager.updateAppWidget(thisWidget, remoteViews);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

请先阅读文档AppWidget GuideAppWidgetProvider。这解释了:

  • 您的onUpdate()方法需要通过updateAppWidget()将RemoteViews发送到窗口小部件。
  • 每秒唤醒一次会耗尽电池电量。当然,您不希望在手机休眠时更新小部件。
  • 对remoteViews.setTextViewText()的每次调用都会向RemoteViews对象附加更多数据。这会在内存中累积过多的数据并使小部件变慢。相反,每次都要获取一个新的RemoteViews实例。

我的关于您未进行更新的假设是当提供程序完成对Intent的响应时,操作系统会停止您的窗口小部件提供程序的组件。您可以通过Log.d()来测试该假设。

您可以注册ACTION_TIME_TICK广播,告诉您时间何时变化,每分钟一次。测试它是否在手机睡眠时不运行(例如保持通话次数)并随时在此处报告。

[已添加] 在实践中显示日期(并且每天更新一次)比日期+时间更容易(并且每分钟更新一次;您的问题代码尝试更新它每秒一次),并且在不使用太多电池电量的情况下这样做。

  • 设置updatePeriodMillis="0"
  • <action android:name="android.intent.action.DATE_CHANGED"/>添加到AndroidManifest.xml中小部件提供程序的<intent-filter>
  • 在AppWidgetProvider中,覆盖

    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) { updateAllMyWidgets(context); }
    }
    
  • 使用DateUtils.formatDateTime()格式化日期。

是的,如果向后调整时钟,则会发生错误code.google.com/p/android/issues/detail?id=2880