使用 AlarmManager.INTERVAL_DAY 时,警报管理器每天重复多次

时间:2021-03-28 10:38:54

标签: java android

MainActivity.java

Intent intent = new Intent(this, AlarmReceiver24.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,1);
calendar.set(Calendar.MINUTE, 50);
calendar.set(Calendar.SECOND, 0);
String time= String.valueOf(calendar.getTime());
Log.i("Time:",time);
//repeat alarm every 24hours
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, alarmIntent);

AlarmReceiver 类

public class AlarmReceiver24 extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        reference.child("Total").setValue(0);
        Toast.makeText(context, "Total Reset", Toast.LENGTH_SHORT).show();

    }
}

Android 清单

<receiver android:name=".AlarmReceiver24"/>

我希望代码每天在午夜 12:00:00 运行一次,但即使在使用 AlarmManager.INTERVAL_DAY 后,它仍会一次又一次地触发。我不知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

每次打开 MainActivity 时都会创建一个新的 PendingIntent

当您开始 MainActivity 时,您应该 remove 所有先前安排的闹钟。

还有

calendar.set(Calendar.HOUR_OF_DAY, 1);
calendar.set(Calendar.MINUTE, 50);
calendar.set(Calendar.SECOND, 0);

不是午夜。

calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);

现在是午夜

答案 1 :(得分:0)

闹钟是过去设置的,所以添加了这个条件并解决了

if(calendar.before(Calendar.getInstance()))
            calendar.add(Calendar.DATE,1);