Диспетчер аварийных сигналов не запускается должным образом - PullRequest
0 голосов
/ 09 марта 2019

У меня проблема со всеми сигналами, которые есть в моем приложении. Вся идея моего приложения зависит от срабатывания будильника в определенное время (если что-то пошло не так, пользователь заплатит деньги (кредиты)). Вот одна из тревог, которые я написал, чтобы объяснить мою проблему:

@Override
protected void onCreate(Bundle savedInstanceState) {
    sendNotification();
    ....
}

public void sendNotification() {
    Calendar cal = Calendar.getInstance();
    Calendar newDay = Calendar.getInstance();

    cal.set(Calendar.HOUR_OF_DAY, 9);// 9 am
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    if (cal.getTimeInMillis() < newDay.getTimeInMillis())
        cal.add(Calendar.DATE, 1);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, NotificationReceiver.class);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 ) ;
    // keep repeating the alarm every 5 mins
    if(alarmManager != null ) {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 300000 , pendingIntent1);
    }
}

По сути, происходит то, что будильник не срабатывает с 9-ти точным, если я не открываю свое устройство с 9-ти, это может быть поздно на 10 минут, а иногда и больше! Если я открывал устройство в 9 часов и получил уведомление, оно должно повторно отправить мне уведомление через 5 минут, и этого не происходит, если я открою приложение по истечении этого периода времени, я получу только уведомление .

Я продолжал искать решение в течение последней недели, и я не смог найти полезного ответа.

1 Ответ

0 голосов
/ 09 марта 2019

Может быть, попробовать использовать метод setExact()?

public void sendNotification() {
Calendar cal = Calendar.getInstance();
Calendar newDay = Calendar.getInstance();

cal.set(Calendar.HOUR_OF_DAY, 9);// 9 am
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

if (cal.getTimeInMillis() < newDay.getTimeInMillis())
    cal.add(Calendar.DATE, 1);

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 ) ;
// keep repeating the alarm every 5 mins
if(alarmManager != null ) {
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)    ///Just used setExact(), it will make alarm go off when time reaches, seconds dont count.

Редактировать

class AlertReceiver : BroadcastReceiver() {

override fun onReceive(context: Context?, intent: Intent?) {

     //track your alarms here. Make sure to keep request codes unique. The intent here can be used to recieve the data you have sent from your activity/fragment. 

     setReminder()//pass whatever data you wish
   }


        private fun setReminder(calendar: Calendar, title: String, text: String, reqCode: Int) {

    val alarmManager: AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val noteText = text//text.replace("[ ]", "☐").replace("[x]", "☑")

    val intent = Intent(this, AlertReceiver::class.java)  //transfer data to notification class
    intent.putExtra("title", title)
    intent.putExtra("text", noteText)
    intent.putExtra("uniqueID", reqCode)

    val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, reqCode, intent, 0)
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
}

 }
...