Android小部件刷新无效

时间:2011-07-21 18:48:41

标签: android widget alarm

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

在我使用此代码的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)方法中获得吐司,除了第一次安装应用程序时。

提前致谢

更新

在mightkevin的帮助下,我重写了代码。我在一个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();

1 个答案:

答案 0 :(得分:0)

首先,您的重复时间应为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);

再次设置之前只是为了确定。