Локальное уведомление запускается непрерывно в течение одной минуты на устройстве Android - PullRequest
0 голосов
/ 27 марта 2019

Я работаю с локальными уведомлениями в приложении ionic 2 с помощью плагина -

ionic cordova plugin add cordova-plugin-local-notification
npm install @ionic-native/local-notifications

Уведомление работает отлично в устройстве ios, но для Android показывает неожиданное поведение.

Исключительное поведение - Повторите уведомление в тот же день в установленное время.

Текущее поведение- Уведомление приходит непрерывно в течение одной минуты.

Мое требование - повторять локальное уведомление в определенный день каждой недели с временем, установленным пользователем. Уведомление также должно повторяться в тот же день и время, установленное пользователем.

Вот мой фрагмент кода -

makeLocalNotificationOn(mainDayNotifyObj, index) {
    let currentDate = new Date();
    let currentDay = currentDate.getDay(); // Sunday = 0, Monday = 1, etc.

    let indexOfDay;

    for (let i = 0; i < this.remainderDaysArray.length; i++) {
        if (mainDayNotifyObj.dayName == this.remainderDaysArray[i]) {
            indexOfDay = i;
            break;
        }
    }

    let setTime = mainDayNotifyObj.time.split(":");
    let hours = parseInt(setTime[0]);
    let minutes = parseInt(setTime[1]);


    let firstNotificationTime = new Date();
    let dayDifference = indexOfDay - currentDay;

    if (dayDifference < 0) {
        dayDifference = dayDifference + 7; // for cases where the day is in the following week
    }

    firstNotificationTime.setHours(firstNotificationTime.getHours() + (24 * (dayDifference)));
    firstNotificationTime.setHours(hours);
    firstNotificationTime.setMinutes(minutes);

    let weekDay = firstNotificationTime.getDay();

       let remainderObj = {
            id: index,
            title: 'Hello',
            text: 'Its time',
            foreground: true,
            trigger: {every: {weekday: weekDay, hour: hours, minute: minutes},firstAt: firstNotificationTime}
        };

    this.notificationArray.push(remainderObj);

    this.platform.ready().then(() => {
        this.localNotifications.schedule(this.notificationArray);

    });

}

Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

@ valencianok Спасибо за ваш ответ. Я действительно ценю это.

Я решил свою проблему, изменив значения триггерного объекта.

Остаток объекта, который я использовал для запуска уведомления, имеет некоторые изменения.

вот фрагмент кода-

remainderObj = {
            id: index,
            title: 'Hello',
            text: 'Its time',
            foreground: true,
            trigger{every{weekday:weekDay,hour:hours,minute:minutes},firstAt: firstNotificationTime,count:1}
        }

Атрибут count сработал, count = 1 запускает уведомление только один раз на устройстве Android.

0 голосов
/ 25 июня 2019

У меня возникла та же проблема, но я изменил MatchTrigger.java для сравнения секунд, поэтому он срабатывает только для второго 00

Ищите

if (cal.get(Calendar.MINUTE) < now.get(Calendar.MINUTE)) {
            switch (unit) {
                case MINUTE:
                    addToDate(cal, now, Calendar.MINUTE, 1);
                    break;
                case HOUR:
                    addToDate(cal, now, Calendar.HOUR_OF_DAY, 1);
                    break;
                case DAY:
                case WEEK:
                    addToDate(cal, now, Calendar.DAY_OF_YEAR, 1);
                    break;
                case MONTH:
                    addToDate(cal, now, Calendar.MONTH, 1);
                    break;
                case YEAR:
                    addToDate(cal, now, Calendar.YEAR, 1);
                    break;
            }
        }

и заменить закрывающую } на

} else
        if (cal.get(Calendar.SECOND) < now.get(Calendar.SECOND)) {
            switch (unit) {
                case MINUTE:
                    addToDate(cal, now, Calendar.MINUTE, 1);
                    break;
                case HOUR:
                    addToDate(cal, now, Calendar.HOUR_OF_DAY, 1);
                    break;
                case DAY:
                case WEEK:
                    addToDate(cal, now, Calendar.DAY_OF_YEAR, 1);
                    break;
                case MONTH:
                    addToDate(cal, now, Calendar.MONTH, 1);
                    break;
                case YEAR:
                    addToDate(cal, now, Calendar.YEAR, 1);
                    break;
            }
        }
...