我的小部件应该每天在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();
答案 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);
再次设置之前只是为了确定。