Android |每天同一时间设置闹钟 |不工作
Android | setAlartm every day at the same hour | not working
在我的 Android 应用程序中,我会在每天 3 a.m 启动一个命令。我使用 AlarmManager
和 setRepeating
。当应用程序启动时,我这样做:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, MyBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 1253, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
这是 MyBroadcast:
public class MyBroadcast extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("ALARM","Alarm worked.");
}
}
购买,而不是 运行 3 处的命令,应用 运行 立即命令。为什么?
当闹钟设置为已过日期时,它会立即触发,如果您不想这样,您可以创建一些逻辑,使其仅在当前时间早于凌晨 3 点时才在今天启动,像这样的方法会起作用:
Calendar now = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, MyBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 1253, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (now.before(cal)) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
else {
cal.set(Calendar.DAY_OF_YEAR, now.get(Calendar.DAY_OF_YEAR) +1);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
我们创建了另一个日历作为当前时间的参考,并检查我们是否在凌晨 3 点之前,如果不是,则只在一天后才叫闹钟。
在我的 Android 应用程序中,我会在每天 3 a.m 启动一个命令。我使用 AlarmManager
和 setRepeating
。当应用程序启动时,我这样做:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, MyBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 1253, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
这是 MyBroadcast:
public class MyBroadcast extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("ALARM","Alarm worked.");
}
}
购买,而不是 运行 3 处的命令,应用 运行 立即命令。为什么?
当闹钟设置为已过日期时,它会立即触发,如果您不想这样,您可以创建一些逻辑,使其仅在当前时间早于凌晨 3 点时才在今天启动,像这样的方法会起作用:
Calendar now = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent intent = new Intent(context, MyBroadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 1253, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (now.before(cal)) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
else {
cal.set(Calendar.DAY_OF_YEAR, now.get(Calendar.DAY_OF_YEAR) +1);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
我们创建了另一个日历作为当前时间的参考,并检查我们是否在凌晨 3 点之前,如果不是,则只在一天后才叫闹钟。