Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Почему моё приложение даёт больше уведомлений чем нужно?

В моём приложении после загрузки телефона устанавливается время в календаре для вызова напоминания

public class BootUpReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent myIntent = new Intent(context , NotifyService.class);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 22);
        calendar.set(Calendar.MINUTE, 23);
        calendar.set(Calendar.SECOND, 00);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24*60*60 * 1000, pendingIntent);  //set repeating every 24 hours


    }

}


который вызывает сервис напоминания
public class NotifyService extends Service {

    NotificationManager nm;

    @Override
    public void onCreate() {
        super.onCreate();
        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        sendNotif();
        return super.onStartCommand(intent, flags, startId);
    }


    void sendNotif() {

        Intent intent = new Intent(this, SplashActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);


        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setContentTitle("UpgradeIM")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentIntent(pIntent)
                .setContentText("Пора написать отчёт за день")
                .setAutoCancel(true);


        //add sound
        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        mBuilder.setSound(uri);

        //vibrate
        long[] v = {500,1000};
        mBuilder.setVibrate(v);

        nm.notify(3, mBuilder.build());

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}


По моим планам это должно быть только одно уведомление в 22:23, но уведомление появляется 4-5 раз за день в совершенно рандомное время и один раз в назначенное.
Что я сделал не так? Как посмотреть в телефоне вообще все установленные на день напоминания от приложений?
  • Вопрос задан
  • 459 просмотров
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Выглядит нормально. А может вы, пока тестировали, поставили несколько будильников? Попробуйте вызвать cancel () с вашим интентом. Переустановка приложения тоже должна помочь. Насколько я знаю, апи для получения всех будильников не существует.
Ответ написан
Комментировать
SolidlSnake
@SolidlSnake
Ваш дружелюбный сосед
AlarmManager начиная с 4 (или 3?) андроида вообще очень странно и не предсказуемо работает.
В своем приложении изрядно попотел, чтобы он работал один раз в нужное время.

Здесь небольшой примерчик без повторений, в методе setNotification.
Здесь небольшой примерчик с повторениями, в методе setUpdateRepeat.

Из того что помню:
  • если время, на которое установлено действие меньше, чем время на устройстве (к примеру уведомление поставили на 8 утра, а сейчас 13 часов), то уведомление происходит мгновенно, вроде как даже с повторением в это время.
  • Флаги FLAG_CANCEL_CURRENT с повторениями и FLAG_ONE_SHOT без повторений могут помочь, чтобы действительно был лишь один экземпляр события
UPD.
Список всех алармов можете получить через adb, с помощью команды:
adb shell dumpsys alarm
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы