有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java setRepeating()函数工作不正常(AlarmManger Android)

我使用setRepeating()函数来安排应用程序中的事件。根据Android文档,setRepeating()与API级别19+不完全一致。在应用程序中,当需要报警时(每天23:59),会调用广播接收器。然而,这个广播接收器被呼叫得太早(例如:有时在我设置警报后立即呼叫,尽管离23:00还有10个多小时)

这是我的代码:

设置报警功能:

public void setEmaResetAlarm(上下文){ alarmManager=(alarmManager)上下文。getSystemService(Context.ALARM_服务); AlarmManager通知=(AlarmManager)上下文。getSystemService(Context.ALARM_服务)

    intentResetNight = new Intent(context, EMAAlarmRcvr.class);
    intentResetNight.putExtra("ema_reset_night", true); //time to reset EMA to 0

    intentResetMorning = new Intent(context, EMAAlarmRcvr.class);
    intentResetMorning.putExtra("ema_reset_morning", true); //time to reset EMA to 0

    intentRemove = new Intent(context, EmaDismissReceiver.class);
    intentRemove.putExtra("ema_pop_up_remove", true); // time to remove EMA pop up


    pendingIntentResetNight = PendingIntent.getBroadcast(context, 10, intentResetNight, PendingIntent.FLAG_UPDATE_CURRENT);
    pendingIntentResetMorning = PendingIntent.getBroadcast(context, 8, intentResetMorning, PendingIntent.FLAG_UPDATE_CURRENT);
    pendingIntentRemove = PendingIntent.getBroadcast(context, 11, intentRemove, PendingIntent.FLAG_UPDATE_CURRENT);

    if (alarmManager == null || alarmManagerMorning == null)
        return;


    emaTimeSubscription = context.getSharedPreferences("SubscriptionCheck", Context.MODE_PRIVATE);
    int hour1 = Integer.parseInt(emaTimeSubscription.getString("hours1", null));
    int hour2 = Integer.parseInt(emaTimeSubscription.getString("hours2", null));
    int hour3 = Integer.parseInt(emaTimeSubscription.getString("hours3", null));


    Calendar firingCallReset = Calendar.getInstance();
    firingCallReset.set(Calendar.HOUR_OF_DAY, 23); // at 11:59pm
    firingCallReset.set(Calendar.MINUTE, 59); // Particular minute
    firingCallReset.set(Calendar.SECOND, 0); // particular second
    firingCallReset.set(Calendar.MILLISECOND, 0); // particular second
    //alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCallReset.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentResetNight);


    Calendar firingCalResetMorning = Calendar.getInstance();
    firingCalResetMorning.set(Calendar.HOUR_OF_DAY, 9); // at 9:30am
    firingCalResetMorning.set(Calendar.MINUTE, 30); // Particular minute
    firingCalResetMorning.set(Calendar.SECOND, 0); // particular second
    firingCalResetMorning.set(Calendar.MILLISECOND, 0); // particular second
    //alarmManagerMorning.setRepeating(AlarmManager.RTC_WAKEUP, firingCalResetMorning.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentResetMorning);


    //remove EMA pop up
    Calendar firingCalRemove11 = Calendar.getInstance();
    firingCalRemove11.set(Calendar.HOUR_OF_DAY, hour1 + 1); // at 11:01am
    firingCalRemove11.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove11.set(Calendar.SECOND, 0); // particular second
    firingCalRemove11.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove11.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);

    Calendar firingCalRemove15 = Calendar.getInstance();
    firingCalRemove15.set(Calendar.HOUR_OF_DAY, hour2 + 1); // at 3:01pm
    firingCalRemove15.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove15.set(Calendar.SECOND, 0); // particular second
    firingCalRemove15.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove15.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);

    Calendar firingCalRemove19 = Calendar.getInstance();
    firingCalRemove19.set(Calendar.HOUR_OF_DAY, hour3 + 1); // at 7:01pm
    firingCalRemove19.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove19.set(Calendar.SECOND, 0); // particular second
    firingCalRemove19.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove19.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);


}

要呼叫的广播接收器:

公共类EmaarmRCVR扩展广播接收器{

@Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences loginPrefs = context.getSharedPreferences("UserLogin", MODE_PRIVATE);

    SharedPreferences configPrefs = context.getSharedPreferences("Rewards", MODE_PRIVATE);




     //For resetting  ema prefr (11:59 PM ) and (9:30 AM )
    if (intent.getBooleanExtra("ema_reset_night", false) || intent.getBooleanExtra("ema_reset_morning", false)) {
        SharedPreferences.Editor ema_editor = configPrefs.edit();
        SharedPreferences.Editor hrm_editor = configPrefs.edit();

        Log.e("TAG", "onReceive: TaskManager" );

        hrm_editor.putBoolean("hrm_completed", false);
        hrm_editor.apply();
        ema_editor.putBoolean("ema1_answered", false);
        ema_editor.putBoolean("ema2_answered", false);
        ema_editor.putBoolean("ema3_answered", false);

        ema_editor.putInt("ema_answered_count", 0);
        ema_editor.apply();

        SharedPreferences.Editor loginEditor = loginPrefs.edit();
        loginEditor.putBoolean("ema_btn_make_visible", false);
        loginEditor.apply();

    }

    

}

}


共 (1) 个答案

  1. # 1 楼答案

    在设置新警报之前,您应该cancel任何以前的警报如下:

    alarmManager.cancel(pendingIntent);
    

    另外,使用与创建新报警相同的待处理意图来取消旧设置的报警,因为它被用作唯一标识符,所以:

    // cancel old alarm
    alarmManager.cancel(pendingIntentRemove);
    // then create new one
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove11.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);
    

    你会在随机时间被呼叫,因为它创建了一个新的警报