接收器在初始 运行 后几秒触发

Receiver triggers a few seconds after initial run

我有这个WakefulBroadcastReceiver

public class UpdateAlarmReceiver extends WakefulBroadcastReceiver {
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE );
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) {
            Intent service = new Intent(context, UpdateSchedulingService.class);
            startWakefulService(context, service);
        }
    }

    public void setAlarm(Context context) {
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, UpdateAlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        final Random r = new Random();
        final int hour = r.nextInt(24-9) + 9;
        final int minute = r.nextInt(60-1) + 1;
        final int second = r.nextInt(60-1) + 1;
        final Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        //calendar.set(Calendar.SECOND, second);

        Toast.makeText(context,"Freq set to: "+Integer.toString(hour)+":"+Integer.toString(minute)+":"+Integer.toString(second),Toast.LENGTH_SHORT).show();
        alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_HALF_DAY, alarmIntent);

        ComponentName receiver = new ComponentName(context, UpdateBootReceiver.class);
        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }

当我第一次 运行 应用程序时,我会调用 setAlarm() 方法并默认激活闹钟管理器。但是在初始应用程序 运行 之后,接收者 onReceive 在几秒钟后被触发,即使初始时间设置为 day.I 的另一个时间段也无法理解为什么它被触发以及如何被触发避免它。

如果您过去设置了闹钟,它会立即触发。

您使用

final Random r = new Random();
final int hour = r.nextInt(24-9) + 9;
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);

这会将日历设置为当前时间,如果

  1. 时间是现在之前,会在的同一天立即触发,或者
  2. 时间在后,当天触发,到指定时间

你应该add你的日历时间,而不是你自己设置,或者改进你的计算,以消除这个错误。