Android setAlarmClock запускается немедленно

#java #android #alarmmanager #android-alarms

#java #Android #alarmmanager #android-сигналы тревоги

Вопрос:

Я создал простое приложение, чтобы попробовать setAlarmClock() . В , есть только одна кнопка MainActivity , и она вызывается setAlarm при нажатии.

Код приведен ниже.

MainActivity

 public class MainActivity extends AppCompatActivity {
    private static final String TAG = "alarmclock.MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void setAlarm(View view) {
        Context context = getApplicationContext();
        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        long nextTrigger = SystemClock.elapsedRealtime() 10*1000;
        Log.i(TAG, SystemClock.elapsedRealtime()   ": scheduling next alarm at "   nextTrigger);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        AlarmManager.AlarmClockInfo ac = new AlarmManager.AlarmClockInfo(nextTrigger, null);
        alarmManager.setAlarmClock(ac, pendingIntent);
    }
}
  

AlarmReceiver

 public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "alarmclock.AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, SystemClock.elapsedRealtime()   " in AlarmReceiver onReceive()");
    }
}
  

Я в основном запускаю сигнал тревоги на 10 секунд позже, но по какой-то причине он запускается немедленно.

 2020-09-21 22:09:56.664 17910-17910/com.example.alarmclock I/alarmclock.MainActivity: 3362358: scheduling next alarm at 3372358
2020-09-21 22:09:56.687 17910-17910/com.example.alarmclock I/alarmclock.AlarmReceiver: 3362382 in AlarmReceiver onReceive()
  

Если я использую setExactAndAllowWhileIdle тот же код, похоже, он работает нормально. Но я специально хочу попробовать setAlarmClock .

Комментарии:

1. что такое «null» после «nextTrigger» в строке кода «ac = …»?

Ответ №1:

Для AlarmClockInfo требуется время на стене:

время, в которое срабатывает основной сигнал тревоги, в миллисекундах настенного времени, начиная с эпохи

но вы используете elapsedRealtime() время, поэтому используйте System.currentTimeMillis его для устранения проблемы.

Комментарии:

1. узнал вскоре после этого и опубликовал ответ примерно в то же время. но спасибо, что ответили так быстро!

2. @chongzixin Счастливого кодирования 🙂

Ответ №2:

Это сработало после того, как я перешел с SystemClock.elapsedRealtime() на System.currentTimeMillis() .

 long nextTrigger = System.currentTimeMillis() 10*1000
  

После более подробного ознакомления с документацией я понимаю, что первый параметр AlarmClockInfo конструктора принимает

long: время, в течение которого срабатывает основной сигнал тревоги в миллисекундах настенного времени с момента начала эпохи

что System.currentTimeMillis() и дает.

С другой стороны, SystemClock.elapsedRealtime() возвращает

время с момента загрузки системы…

которое всегда будет намного меньшим числом, чем время работы с epoch. В результате тревога назначается немедленно, потому что

Если указанное время запуска прошло, тревога будет запущена немедленно.