【问题标题】:alarm trigger immediately and broadcast receiver methods get called immediately立即触发警报并立即调用广播接收器方法
【发布时间】: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


【解决方案1】:

我假设这是问题所在:

mCalendar.set(Calendar.MONTH, --mMonth);

这第一次会起作用,但下一次mMonth 的值将比应有的值小1,因为您已经减小了mMonth 的值。在这种情况下,触发时间已经过去,导致警报立即触发。

试试这个:

mCalendar.set(Calendar.MONTH, mMonth - 1);

【讨论】:

  • 我改变了这个实现并使用了 Calendar calendar=new GregorianCalendar(year,month,day);你的解决方案可能是正确的。
  • 如果我的回答对您有帮助,您可以通过单击答案旁边的绿色复选标记“接受”它。这给了我一些声誉积分,并且将来可能会帮助其他人。它还会将该问题从未回答的问题列表中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多