繁体   English   中英

Xamarin Android从通知中取消任务

[英]Xamarin Android Cancel Task from Notification

我有一种方法,每个TimeSpan间隔将向用户发送一次本地通知:

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。

首先在您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();
        }
    }
}

不要忘记激活注册接收器:

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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM