Alarm Manager для отправки уведомлений в определенное время ежедневно, кроме воскресенья, и отключение push-уведомлений для отображения при срабатывании - PullRequest
0 голосов
/ 08 ноября 2018

Когда пользователь впервые входит в приложение, я использую Alarm Manager и Pending Intent для включения push-уведомлений каждый день за 1 час до определенного времени отключения.

Однако я хочу, чтобы это происходило ежедневно, кроме воскресенья недели. Как мне это сделать? (Обратите внимание, что я пробовал setrepeating, но он не работает для новой версии, которая у меня есть API 26)

Кроме того, при каждом входе в систему будет отправляться уведомление. Как я могу запретить его показ во время входа в систему (запуск на следующий день)?

У меня есть метод с именем scheduleNotification в моем первом CatalogueFragment при входе в систему, который содержит следующее:

    Intent notificationIntent = new Intent(context, AlarmReceiver.class);
    notificationIntent.putExtra("notif_content", content);
    notificationIntent.putExtra("isEnglish", isEnglish);
    notificationIntent.putExtra("notif_id", notificationId);
    notificationIntent.putExtra("hour", "" + (Integer.parseInt(hour) - 1));
    notificationIntent.putExtra("mins", mins);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

    loginPreferences = getActivity().getSharedPreferences("loginPrefs", MODE_PRIVATE);
    loginPrefsEditor = loginPreferences.edit();
    if (loginPreferences.getBoolean("FirstTimeLogin", true)) {
        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        loginPrefsEditor.putBoolean("FirstTimeLogin", false);
        loginPrefsEditor.apply();
    }

В моем AlarmReceiver.class

 public void onReceive(final Context context, Intent intent) {
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    String isEnglish = intent.getStringExtra("isEnglish");
    final String id = "my_channel_id_01";
    CharSequence name = "channel_name";
    String description = "channel_description";
    int importance = NotificationManager.IMPORTANCE_LOW;
    int notificationId = intent.getIntExtra("notif_id", 0);
    String hour = intent.getStringExtra("hour");
    String mins = intent.getStringExtra("mins");
    String cutoffHour = "" + (Integer.parseInt(hour) + 1);
    String cutofftime = cutoffHour + ":" + mins;

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
    calendar.set(Calendar.MINUTE, Integer.parseInt(mins));

    String content = "Please place order before " + cutofftime + " AM for today's delivery";

    Intent notificationIntent = new Intent(context, AlarmReceiver.class);
        notificationIntent.putExtra("notif_id", Integer.parseInt(new SimpleDateFormat("ddHHmmss").format(new Date())));
        notificationIntent.putExtra("hour", hour);
        notificationIntent.putExtra("mins", mins);
        notificationIntent.putExtra("isEnglish", isEnglish);
        notificationIntent.putExtra("notif_content", content);

        NotificationChannel mChannel = new NotificationChannel(id, name, importance);
        mChannel.setDescription(description);
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.createNotificationChannel(mChannel);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, id)
                .setContentTitle("Gentle reminder")
                .setContentText(content)
                .setSmallIcon(R.drawable.logo)
                .setAutoCancel(true);

        Intent notifIntent = new Intent(context, LoginActivity.class);
        PendingIntent activity = PendingIntent.getActivity(context, notificationId, notifIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        builder.setContentIntent(activity);
        Notification notification = builder.build();
        notificationManager.notify(notificationId, notification);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 24 * 60 * 60 * 1000, pendingIntent);

1 Ответ

0 голосов
/ 12 ноября 2018

Если вы хотите активировать будильник ежедневно, кроме воскресенья, вы можете сделать это одним из двух способов: - Установите будильник на следующий день. Когда будильник сработает, проверьте, является ли следующий день воскресением. Если это воскресенье, установите будильник на 2 дня (в понедельник), иначе установите будильник на следующий день. - Установите повторяющийся сигнал, который срабатывает каждый день. Когда будильник сработает, проверьте, воскресенье ли это, и если да, просто проигнорируйте будильник.

...