【发布时间】:2020-12-04 18:25:39
【问题描述】:
警报第一次根据我们设置的时间工作立即触发,但无论我们设置的时间如何,它都会立即触发
报警代码
mCalendar = Calendar.getInstance();
mHour = mCalendar.get(Calendar.HOUR_OF_DAY);
mMinute = mCalendar.get(Calendar.MINUTE);
mYear = mCalendar.get(Calendar.YEAR);
mMonth = mCalendar.get(Calendar.MONTH) + 1;
mDay = mCalendar.get(Calendar.DATE);
timePicker.setOnTimeChangedListener((view, hourOfDay, minute) -> {
mHour = hourOfDay;
mMinute = minute;
//Globals.showToast(getActivity(), hourOfDay + ":" + minute);
});
点击按钮会调用以下代码
int rcode = new Random().nextInt();
alarmManager = (AlarmManager) Objects.requireNonNull(getActivity()).getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
Intent intent = new Intent(getActivity(), AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(
this.getActivity(), rcode, intent, PendingIntent.FLAG_UPDATE_CURRENT| Intent.FILL_IN_DATA);
mCalendar.set(Calendar.MONTH, --mMonth);
mCalendar.set(Calendar.YEAR, mYear);
mCalendar.set(Calendar.DAY_OF_MONTH, mDay);
mCalendar.set(Calendar.MINUTE, mMinute);
mCalendar.set(Calendar.HOUR_OF_DAY, mHour);
mCalendar.set(Calendar.SECOND, 0);
/* SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyy hh:mm:a", Locale.ENGLISH);
Globals.showToast(getActivity(), simpleDateFormat.format(mCalendar.getTimeInMillis()));*/
// Calculate notification time
Calendar c = Calendar.getInstance();
long currentTime = c.getTimeInMillis();
long diffTime = mCalendar.getTimeInMillis() - currentTime;
// Start alarm using notification time
alarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + diffTime,
pendingIntent);
我使用上面的代码设置闹钟,但它仅适用于第一次闹钟设置。然后在使用我设置的任何警报后,它会立即触发。
接收器下方的吐司立即显示
接收方代码
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Globals.showToast(context, "Alarm Time");
}
}
【问题讨论】:
-
我想您可能混淆了异步和同步编程?当用户选择时间时,将调用 OnTimeChangedListener 或在这种情况下调用 lambda。但唯一会发生的是 2 个作业将执行“mHour = hourOfDay; mMinute = minute;”。除非您将它放在一个函数中并从 OnTimeChangedListener 中调用它,否则侦听器下面的其余代码将不会被执行。
-
@Elletlar 我已经编辑了问题以明确代码的使用方式。我真的不知道为什么会出现这个问题。
-
谢谢。选择新时间后,计算值“diffTime”是否设置为预期值?
-
@Elletlar yes "diffTime" 是每次新点击的最新时间
-
你能解决你的问题吗?
标签: android calendar alarmmanager android-pendingintent