Я выбираю случайные дни для уведомления, но уведомление отображается каждый день - PullRequest
1 голос
/ 01 августа 2020

Я пытаюсь установить уведомление, используя android studio на android уровне 26+, но если я выбираю случайные дни для уведомления, но уведомление отображается каждый день

Как установить Calendar.DAYS_OF_WEEK ... ..подобно, если сегодня воскресенье, и я устанавливаю Calendar.DAYS_OF_WEEK, 3 (вторник), диспетчер сигналов тревоги должен получать уведомление только каждый вторник, но он также показывает уведомление в воскресенье

 private void setNotification(AlarmList values) {
    Cursor data = mDatabaseHelper.getItemID(values.getMedicineName());
    int itemID = -1;
    while (data.moveToNext()) {
        itemID = data.getInt(0);
    }
    if (itemID > -1) {

        Intent intent = new Intent(getApplicationContext(), NotificationReceiver.class);
        intent.putExtra("name", values.getMedicineName());
        intent.putExtra("quantity", values.getQuantity());
        intent.putExtra("quality", values.getQuality());
        intent.putExtra("id", itemID);
        intent.putExtra("days", days);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), (itemID), intent, PendingIntent.FLAG_UPDATE_CURRENT);

        for (int i = 0; i < 7; i++) {
            if (days[i]) {
                Calendar calendar = Calendar.getInstance();

                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                calendar.set(Calendar.SECOND, 0);
                calendar.set(Calendar.MILLISECOND, 0);
                calendar.set(Calendar.DAY_OF_WEEK, (i + 1));

                long alarm_time = calendar.getTimeInMillis();
                
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarm_time,
                        AlarmManager.INTERVAL_DAY*7, pendingIntent);
            }
        }
        finish();
        Intent activity = new Intent(AddMedicine.this, TabLayoutActivity.class);
        // i.putExtra("fragment id",1);
        startActivity(activity);
    }

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class NotificationReceiver extends BroadcastReceiver {

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

       String name = intent.getStringExtra("name");
       String quantity = intent.getStringExtra("quantity");
       String quality = intent.getStringExtra("quality");
       int id = intent.getIntExtra("id", 0);
       boolean days[] = intent.getBooleanArrayExtra("days");

       String Heading = "Medicine Reminder";
       String text = "Reminder for " + name + " " + quantity + " " + quality;
     
               NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
               Intent repeatingIntent = new Intent(context, NotificationView.class);
               repeatingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

               PendingIntent pendingIntent = PendingIntent.getActivity(context, id, repeatingIntent, PendingIntent.FLAG_UPDATE_CURRENT);

               NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "notify")
                       .setContentIntent(pendingIntent)
                       .setSmallIcon(R.drawable.clock)
                       .setContentTitle(Heading)
                       .setContentText(text)
                       .setAutoCancel(true)
                       .setPriority(NotificationCompat.PRIORITY_DEFAULT);
                       notificationManager.notify(id, builder.build());
                  }
               }

1 Ответ

0 голосов
/ 03 августа 2020

Установка Calendar таким образом ненадежна. Вы никогда не должны звонить по номеру set(), используя DAY_OF_WEEK.

Если вы хотите, чтобы будильник сработал в следующую среду, вам следует выяснить дату (месяц, день, год) следующей среды и установить ее. на Calendar.

См. Установка DAY_OF_WEEK возвращает неожиданный результат

См. также https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4655637

Пример создания экземпляра Calendar для текущего времени на следующую СРЕДУ:

Calendar calendar = Calendar.getInstance();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
// dayOfWeek is 1..7 (SUNDAY to SATURDAY)
int daysToAdd = Calendar.WEDNESDAY - dayOfWeek;
// Subtract current day of week from the day of week you want
if (daysToAdd < 0) {
    // Current day of the week is after WEDNESDAY, so we go to next week
    daysToAdd += 7;
}
// If daysToAdd is zero, today is already WEDNESDAY!
if (daysToAdd != 0) {
    calendar.add(Calendar.DATE, daysToAdd);
}
...