我的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);
}
}
}
答案 0 :(得分:1)
请先阅读文档AppWidget Guide和AppWidgetProvider。这解释了:
我的关于您未进行更新的假设是当提供程序完成对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。