首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不是onUpdate in AppWidgetProvider

不是onUpdate in AppWidgetProvider
EN

Stack Overflow用户
提问于 2014-02-20 14:00:55
回答 1查看 1.1K关注 0票数 0

我的Android小部件没有更新日期。

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

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-20 22:39:20

请先阅读文档,AppWidget指南AppWidgetProvider。这就解释了:

  • 您的onUpdate()方法需要通过updateAppWidget()向小部件发送一个RemoteViews。
  • 每秒醒来一次会耗尽你的电池。你当然不想在手机睡觉的时候更新这个小部件。
  • 每次对remoteViews.setTextViewText()的调用都会向RemoteViews对象追加更多的数据。这将在内存中积累多余的数据,并使小部件变慢。相反,每次都获得一个新的RemoteViews实例。

我关于您的更新没有发生的假设是,当提供程序完成对某个意图的响应时,操作系统会停止您的小部件提供程序的组件。您可以通过Log.d()验证这一假设。

您可以注册一个滴答广播,该广播可以告诉您时间何时变化,每分钟一次。做测试,它没有运行时,电话睡觉(例如,保持一个电话计数),并在这里随时报告。

添加了--在实践中显示日期(并每天更新一次)要比显示日期+时间(并每分钟更新一次;您的问题代码尝试每秒更新一次)容易得多,并且无需使用大量电池电源就可以做到这一点。

  • 设置updatePeriodMillis="0"
  • <action android:name="android.intent.action.DATE_CHANGED"/>添加到AndroidManifest.xml中的小部件提供程序的<intent-filter>中。
  • 在AppWidgetProvider中,重写 公共onReceive(上下文,意图){super.onReceive(上下文,意图);if {updateAllMyWidgets(上下文);}}
  • 使用DateUtils.formatDateTime()格式化日期。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21910048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档