Создание уведомления в определенное время - PullRequest
0 голосов
/ 10 декабря 2018

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

, поэтому я хочу знать, как лучше всего это делать и как мне это делать.сделайте это, так как текущее решение, которое у меня есть, даже не очень хорошо работает.

способ, которым я делаю это сейчас, - это использование AlarmManager для запуска BroadcasReciever, который создает и показывает уведомление.

мне нужно использовать сервис?и если да, то как мне это сделать?

КОД:

    private void StartDBUpdateAlarm() // Start the alarm manager for event reminder 
    {
        // Get the eventos orded by date (Later than DateTime.Now),
        // so that we can get the earliest events
        var eventos = eventDao.Select(FromEventos.OrderByDate, DateTime.Now);

        if ((eventos.Count > 0)) // Only create notification if there is an event
        {
            // Create the Intent to pass some info through it to the notification
            Intent alarmIntent = new Intent(this, typeof(ReminderReciever));

            // Putting the information that will be passed with constant Id's  
            alarmIntent.PutExtra(GerirUtils.INTENT_TITLE, GetString(Resource.String.main_notification_title));
            alarmIntent.PutExtra(GerirUtils.INTENT_INFO, "Info");
            alarmIntent.PutExtra(GerirUtils.INTENT_CONTENT, eventos[0].Descricao);

            // Creating/Recreating the Pending Intent that will pass the actual information to the notification
            PendingIntent pendingIntent = PendingIntent.GetBroadcast(this, GerirUtils.NOTIFICATION_REMINDER_ID, alarmIntent, 0);

            // Getting the date and time of the next event, then calculate the diference between DateTime.Now,
            // to know how much time it'll be until next event, so that we know when to trigger the notification
            DateTime eventDateTime = CalendarHelper.EventDateTime(eventos[0]);                
            TimeSpan eventMillis = (eventDateTime - GerirUtils.BaseUTCDate); // BaseDate is just the Utc date = 1970/01/01, because the alarm counts millis since then

            // Creating and setting the alarm manager
            alarm = (AlarmManager)GetSystemService(Context.AlarmService);
            alarm.SetExact(AlarmType.RtcWakeup, (long)eventMillis.TotalMilliseconds, pendingIntent);
        }
    }

КЛАСС ПРИЕМНИКА

[BroadcastReceiver(Enabled = true)]
public class ReminderReciever : BroadcastReceiver
{
    private string type, title, info, content;
    private IList<string> events;
    private int notificationId;
    private Context context;

    public override void OnReceive(Context context, Intent intent)
    {
        this.context = context;
        notificationId = intent.GetIntExtra(GerirUtils.INTENT_ID, -1);
        type           = intent.GetStringExtra(GerirUtils.INTENT_TYPE);
        events         = intent.GetStringArrayListExtra(GerirUtils.INTENT_EVENTS);

        title    = intent.GetStringExtra(GerirUtils.INTENT_TITLE);
        info     = intent.GetStringExtra(GerirUtils.INTENT_INFO);
        content  = intent.GetStringExtra(GerirUtils.INTENT_CONTENT);


        if(notificationId > -1)
            if(type == GerirUtils.NOTIFICATION_TYPE_EVENT_REMINDER)
                ShowNotification();
            else if(type == GerirUtils.NOTIFICATION_TYPE_ADDED_EVENTS)
                ShowNotificationList();
    }

    private void ShowNotification() 
    {
        Android.Net.Uri sound = RingtoneManager.GetDefaultUri(RingtoneType.Alarm);
        NotificationManager mNotificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);

        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
        {
            NotificationChannel channel = new NotificationChannel("default", title, NotificationImportance.Default) { Description = content };
            mNotificationManager.CreateNotificationChannel(channel);
        }

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "default")
                    .SetSmallIcon(Resource.Mipmap.ic_calendario_gerir) // notification icon
                    .SetContentTitle(title)  // title for notification
                    .SetContentText(content) // message for notification
                    .SetContentInfo(info)    // Info message next to content
                    .SetSound(sound)         // set alarm sound for notification
                    .SetAutoCancel(true);    // clear notification after click

        Intent intent = new Intent(context, typeof(MainActivity));

        PendingIntent pi = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.UpdateCurrent);
        mBuilder.SetContentIntent(pi);
        mNotificationManager.Notify(0, mBuilder.Build());
    }
}

1 Ответ

0 голосов
/ 12 декабря 2018

Что ж, мне удалось найти проблему после тщательной проверки кода, похоже, что я не отправлял уведомление через намерение.намерение для BroadcastReviever всегда было значением по умолчанию -1, поэтому оператор if всегда был ложным и, глупый я, не выдавал сообщение с предупреждением, когда Id был -1, поэтому мне было труднее найтиошибка, что было бы, если бы у меня было сообщение.

и так, решением было добавить эту строку кода в программу:

private void StartDBUpdateAlarm() // Start the alarm manager for event reminder 
{
    ...
    ...

    if ((eventos.Count > 0)) // Only create notification if there is an event
    {
        // Create the Intent to pass some info through it to the notification
        Intent alarmIntent = new Intent(this, typeof(ReminderReciever));

        // MISSING LINE OF CODE
        alarmIntent.PutExtra(GerirUtils.INTENT_ID, GerirUtils.NOTIFICATION_REMINDER_ID);
        ...
        ...
        ...            
    }
}
...