Глядя на ваши примеры кода по порядку:
В вашем первом примере вы используете AlarmManager.set - это строго для одноразовых сигналов, так что да, он будет срабатывать только один раз. Если вы хотите использовать AlarmManager.set, то последнее, что должен сработать код, это установить новый сигнал тревоги (который также должен использовать свежий PendingIntent).
Во втором примере вы используете повторяющийся сигнал тревоги. Вам не нужно создавать новый PendingIntent каждый раз, когда это срабатывает, поскольку ОС заботится о повторяющихся аспектах тревоги.
Нет причины, по которой ваш сигнал тревоги не должен повторяться каждые 3 секунды, поэтому я бы начал смотреть на реализацию BroadcastReceiver, которую вы написали для обработки сигнала тревоги.
Проверьте, правильно ли вы реализовали это. Закомментируйте весь код в методе onReceive () и вместо этого просто сделайте так, чтобы он записывал сообщение в журнал. Как только вы увидите, что ваше сообщение журнала появляется в logcat при каждом срабатывании будильника, добавьте свой код обратно (сохраняя сообщение журнала) и еще одно сообщение журнала в конец метода. Это позволяет увидеть, сколько времени занимает выполнение метода - вы хотите, чтобы он был завершен до того, как снова сработает сигнализация, чтобы избежать каких-либо неожиданных побочных эффектов.
Кроме того, если вам нужен повторяющийся сигнал тревоги, android.os.Handler - гораздо более эффективный подход, хотя сигналы тревоги, установленные с помощью AlarmManager, срабатывают очень точно.