#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. В результате тревога назначается немедленно, потому что
Если указанное время запуска прошло, тревога будет запущена немедленно.