【问题标题】:Android widget refresh not workingAndroid小部件刷新不起作用
【发布时间】:2011-07-21 18:48:41
【问题描述】:

我的小部件应该在每天 0:00 刷新它的文本视图。在 widget_provider.xml 我设置了 android:updatePeriodMillis="1000" 但我读到最短更新周期是 30 分钟,我必须为此使用 alarmManager。所以我想要一个每天 0:00 触发刷新的闹钟。 UpdateService.class 处理刷新(根据日期为文本视图设置文本。直到午夜后半小时左右才调用该类)

在public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 方法中我使用了这段代码:

 Intent intentN = new Intent(context, UpdateService.class);
 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentN, PendingIntent.FLAG_UPDATE_CURRENT);
 Calendar calendarN = Calendar.getInstance();
 calendarN.setTimeInMillis(System.currentTimeMillis());
 calendarN.add(Calendar.HOUR_OF_DAY, 20);
 calendarN.add(Calendar.MINUTE, 44);
 calendarN.add(Calendar.SECOND, 5);
 AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarN.getTimeInMillis(), 7000, pendingIntent);

(我现在正在尝试实际时间)

这是存放此代码的正确位置吗?为什么它不起作用?我在 UpdateService.java 中使用 toast 消息,但除了第一次安装应用程序时,我从未在 onStart(Intent intent, int startId) 方法中获得 toast。

提前致谢

更新

在可能凯文的帮助下,我重写了代码。我在 Activity 中尝试了这段代码,它可以工作:

   Intent myIntent = new Intent(MainActivity.this, UpdateService.class);
        PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, myIntent, 0);

                 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                 alarmManager.cancel(pendingIntent);
                 Calendar calendar = Calendar.getInstance();
                 calendar.setTimeInMillis(System.currentTimeMillis());
                 calendar.add(Calendar.SECOND, 10);
                 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 8000, pendingIntent);
        Toast.makeText(MainActivity.this, "Start Alarm", Toast.LENGTH_LONG).show();

但是,如果我为 AppWidgetProvider 类修改它(并把它放在那里)它就不起作用。我什至连吐司都没有收到:

 Intent myIntent = new Intent(context, UpdateService.class);
         PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

                  AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
                  alarmManager.cancel(pendingIntent);
                  Calendar calendar2 = Calendar.getInstance();
                  calendar2.setTimeInMillis(System.currentTimeMillis());
                  calendar2.add(Calendar.SECOND, 10);
                  alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), 8000, pendingIntent);
         Toast.makeText(context, "Start Alarm", Toast.LENGTH_LONG).show();

【问题讨论】:

    标签: android widget alarm


    【解决方案1】:

    首先,您的重复时间应该是 24 * 60 * 60 * 1000,因为它以毫秒为单位。 其次,您可以使用距下一个 0:00 的时间找到您的开始时间:

    final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000;
    long timeUntilMidnight = MILLIS_IN_DAY - (System.currentTimeMillis() % MILLIS_IN_DAY);
    

    然后通过将剩余时间添加到当前时间来设置闹钟:

    alarmManager.setRepeating(...System.currentTimeMillis() + timeUntilMidnight, MILLIS_IN_DAY...);
    

    确保您没有设置多个相同的闹钟。我喜欢打电话

    alarmManager.cancel(pendingIntent);
    

    在再次设置之前以确保。

    【讨论】:

    • 频率为 7000 毫秒以测试重复。我用你的代码更新了主帖。不工作..
    • 但是,我在 timeUntilMidnight 上运行了祝酒词,它说午夜将在 1:47(6212436 毫秒),这意味着凌晨 2 点(现在是凌晨 12:13)。跨度>
    • 很抱歉它还没有起作用。现在的问题只是时间问题吗?或者该服务还没有启动。
    • 问题肯定出在最后一行。我将警报设置为 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, 5000, pendingIntent);但它从未被解雇。
    • 我也试过一次性闹钟:alarmManager.set(AlarmManager.RTC_WAKEUP, calendarN.getTimeInMillis()+ 10 * 1000, pendingIntent);但这也不起作用。是否有可能每 30 分钟调用一次 AppWidgetProvider 的 onUpdate 方法?因为 UpdateService.java 每 30 分钟调用一次。也许这整个警报代码是在错误的地方。但是我应该把它放在哪里呢?
    猜你喜欢
    • 2012-11-29
    • 2023-03-09
    • 2015-10-28
    • 1970-01-01
    • 2021-05-24
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多