Когда пользователь впервые входит в приложение, я использую 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);