在特定时间重置变量(在应用重启后也继续这样做)

Reset a variable on a specific time (also keep doing this after app restart)

所以我想要一个变量在一天中的特定时间重置为 0。我让这部分工作了。

但是每次应用程序重新启动时,闹钟都会停止工作。

我得到一个“TimePicker”,它从用户那里获取时间,然后调用这个方法。

public void setAlarmResetDose(long timeInMillis) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(this, AlarmResetTaken.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,0);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent);
}

上述方法调用 class“AlarmResetTaken”,它是一个“BroadcastReciver”class,它运行代码来重置变量。

但是就像我说的那样,只要应用程序是 运行,这就有效。当应用程序重新启动时,只有当用户使用“TimePicker”输入新时间时,闹钟才会再次开始工作。

我解决问题的尝试

我使用了 TimePicker 中的代码并将其保存在一个变量中:

timeDoseResetTotal = calendar.getTimeInMillis();

这次我也用了sharedPreferences来省事

然后在 MainActivity onCreate 中加载了 sharedPreferences 值和 运行 方法“setAlarmResetDose(timeDoseResetTotal);” (具有该值)。

但这似乎不起作用。

有人知道我如何让它工作吗? :/

编辑:

我创建了这个方法并在 MainActivity onCreate 中调用了它。

    public  void startAlarmBroadcastReceiver() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(
                calendar.get(Calendar.YEAR),
                calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH),
                timeDoseResetHour,
                timeDoseResetHour,
                0

        );
        setAlarmResetDose(calendar.getTimeInMillis());

其中 "timeDoseResetHour" 和 "timeDoseResetMin" 加载了之前的 SharedPreferences。如果用户在该时间之前打开应用程序,它现在可以工作,但不能在之后。所以我想如果你在第二天的特定时间之后重新打开应用程序。有任何想法吗? :)

AlarmManager.setExactAndAllowWhileIdle 似乎是您需要的方法。这里的权衡是您需要在每次响起时重新安排此警报。