Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未在AppWidgetProvider中更新_Java_Android Widget - Fatal编程技术网

Java 未在AppWidgetProvider中更新

Java 未在AppWidgetProvider中更新,java,android-widget,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小部件没有更新日期

这是一个只有日期的小部件,没有更多

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);
        }
    }
}

请先阅读文档,然后。这说明:

  • 您的onUpdate()方法需要通过updateAppWidget()向小部件发送RemoteView
  • 每秒醒来一次会耗尽你的电池。您当然不想在手机处于睡眠状态时更新小部件
  • 每次调用RemoteView.setTextViewText()都会向RemoteView对象追加更多数据。这将在内存中积累多余的数据,并使小部件速度变慢。相反,每次都要获取一个新的RemoteView实例
我对您的更新没有发生的假设是,当提供程序完成对意图的响应时,操作系统会停止您的小部件提供程序的组件。您可以通过Log.d()测试该假设

你可以注册一个广播,告诉你时间何时改变,每分钟一次。请测试手机睡眠时它是否不运行(例如,记录通话次数),并随时返回此处报告

[新增]实际上,显示日期(每天更新一次)要比显示日期+时间(每分钟更新一次;您的问题代码尝试每秒更新一次)容易得多,而且不需要使用太多电池电量

  • 设置
    updatePeriodMillis=“0”

  • 如果时钟向后调整,则会添加

    谢谢你,先生非常友好。请想知道是否可以使用此项目的调试。当我尝试时,它不起作用。谢谢,但尽管这对我帮助很大,因为我是Android的新手,他的解释非常大。如果你能给我发一个关于行动时间的链接,请勾选这样的例子。我会永远感激的。调试器应该在这个项目上工作。如果您在设备上运行,请记住使用设置来启用开发功能,包括调试。您可能希望从一个只使用活动的更简单的项目开始。这个项目需要学习widget、Intent、receiver、Services等。web搜索将找到使用ACTION_TIME_TICK[尽管其中一些设计不完善]的示例,例如:
    registerReceiver(new DemoReceiver()、new IntentFilter(Intent.ACTION_TIME_TICK))它需要在服务中才能在后台运行。该页面还讨论了设备重新启动时的重新注册以及停止服务的必要性。我认为清单不需要intent-filter中的
    。更好的主意是:只有当屏幕打开且时钟小部件的实例存在时,它才可以节省电池电量、CPU和内存来监听操作时间。为此,在清单中定义一个广播接收器,用于打开和关闭操作屏幕。在操作屏幕上,如果WidgetId数组不为空,则启动服务。该服务将注册操作时间。当它收到勾号时,服务将更新小部件,或者,如果widgetIds数组为空,则停止自身。同样在“动作屏幕”关闭时,停止服务。谢谢,我肯定是在和另一个银河系的生物说话:)我真的很感激,但如果你解释得好,我就不明白了,对不起。我已经考虑过了。因为onUpdate每30分钟更新一次。为什么不看一天中的时间,如果是00:00:01,我会更新文本视图并准备好。我想这不会损害电池消耗或使用cpu作为最短更新时间。你不这么认为吗?。
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) { updateAllMyWidgets(context); }
    }