代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Van Laethem

Xamarin Android取消通知中的任务

  •  0
  • Jeffrey Van Laethem  · 技术社区  · 6 年前

    我有一种方法,可以在每个时间间隔向用户发送一次本地通知:

    public async void GetVehiclePositionRepeatAsync(TimeSpan interval, CancellationToken cancellationToken)
        {
            while (true)
            {
                var task = new Task(() => 
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    var not = new PushNotificationGenerator(this, "Hooray!", "yay", "STOP_NOTIFICATIONS");
                            not.Push();
                });
                task.Start();
                await Task.Delay(interval, cancellationToken);
            }
        }
    

    我拍摄的目的是在通知上有两个选项;将取消当前通知,但允许此任务继续运行。另一个将取消此任务。以下是PushNotificationGenerator类:

    public class PushNotificationGenerator
    {
        public MapActivity Activity { get; set; }
        public string Title { get; set; }
        public string Text { get; set; }
        public string ChannelId { get; set; }
        public PushNotificationGenerator(MapActivity act, string title, string txt, string channelId)
        {
            Activity = act;
            Title = title;
            Text = txt;
            ChannelId = channelId;
        }
    
        public void Push()
        {
            var resultIntent = new Intent();
            resultIntent.SetAction("Dismiss");
    
            var stackBuilder = TaskStackBuilder.Create(Activity);
            stackBuilder.AddParentStack(Class.FromType(typeof(MapActivity)));
            stackBuilder.AddNextIntent(resultIntent);
    
    
            var resultPendingIntent = stackBuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent);
    
            var builder = new NotificationCompat.Builder(Activity, ChannelId)
                          .SetAutoCancel(true)
                          .SetContentTitle(Title)
                          .SetSmallIcon(Resource.Drawable.stop_bus)
                          .SetContentText(Text)
                          .AddAction(0, "Dont Dismiss", resultPendingIntent)
                          .AddAction(0, "Dismiss", resultPendingIntent);
    
            var notificationManager = NotificationManagerCompat.From(Activity);
            notificationManager.Notify(41144, builder.Build());
        }
    }
    

    我不知道如何使用通知中的CancellationToken。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Leo Zhu    6 年前

    你第一 Push 方法:

    public void Push()
    {
        ...
        Intent intentDismiss = new Intent(this, typeof(NotivicationBroadCast));
        intentDismiss.SetAction("notification_dismiss");
        PendingIntent pendingIntentDismiss = PendingIntent.GetBroadcast(this, 0,
        intentDismiss, PendingIntentFlags.UpdateCurrent);
    
        Intent intentCancel = new Intent(this, typeof(NotivicationBroadCast));
        intentCancel.SetAction("notification_cancel");
        PendingIntent pendingIntentCancel = PendingIntent.GetBroadcast(this, 0,
        intentCancel, PendingIntentFlags.UpdateCurrent);
    
        var builder = new NotificationCompat.Builder(Activity, ChannelId)
                      .SetAutoCancel(true)
                      .SetContentTitle(Title)
                      .SetSmallIcon(Resource.Drawable.stop_bus)
                      .SetContentText(Text)
                      .AddAction(0, "Dont Dismiss", pendingIntentDismiss)
                      .AddAction(0, "Dismiss", pendingIntentCancel );
    
        var notificationManager = NotificationManagerCompat.From(Activity);
        notificationManager.Notify(41144, builder.Build());
    }
    

    在里面 GetVehiclePositionRepeatAsync 方法:

    public async void GetVehiclePositionRepeatAsync(TimeSpan interval, CancellationToken cancellationToken)
    {
            while (!cancellationToken.IsCancellationRequested) { 
                var task = new Task(() =>
                {
                    cancellationToken.Token.ThrowIfCancellationRequested();
                    var not = new PushNotificationGenerator(this, "Hooray!", "yay", "STOP_NOTIFICATIONS");
                    not.Push();
                },cancellationToken.Token);
                task.Start();
                await Task.Delay(interval);
            }
        }
    }
    

    那么海关呢 NotivicationBroadCast :

    [BroadcastReceiver]
    class NotivicationBroadCast : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            string action = intent.Action;
            if (action.Equals("notification_dismiss"))
            {
                 NotificationManager notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);            
                 notificationManager.Cancel(notificationId);
            }
            if (action.Equals("notification_cancel"))
            {              
                cancellationToken.Cancel();
            }
        }
    }
    

    别忘了在Activy中注册接收者:

    protected override void OnResume()
        {
            base.OnResume();
            NotivicationBroadCast recieve = new NotivicationBroadCast();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.AddAction("notification_dismiss");
            intentFilter.AddAction("notification_cancel");
            RegisterReceiver(recieve, intentFilter);
            begin();
        }