c# - Android 通知按钮 (AddAction) 在按下时发出 Toast 消息

标签 c# android notifications xamarin.android

我想在通知(存档)按钮上添加一个操作,例如当有人点击它时,它会显示一条 toast 消息,下面是示例图片:

Image 这是我的PendingIntent代码行:

var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);

这是我的通知生成器代码:

var builder = new NotificationCompat.Builder(context)
    .SetContentIntent(contentIntent)
    .SetSmallIcon(Resource.Drawable.ic_launcher)
    .SetContentTitle(title)
    .SetStyle(style).SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis())
    .AddAction(Resource.Drawable.tick_notify, "ARCHIVE", contentIntent)
    .AddAction(Resource.Drawable.cancel_notify, "REPLY", pIntent)
    .SetAutoCancel(true);

//check bellow
builder.SetDefaults((int)(NotificationDefaults.Sound | NotificationDefaults.Vibrate));

所以通常我想制作一个按钮来发出通知,而不是启动 Activity 等。

请帮我解决这个问题,我是 Xamarin.android 的新手。

编辑:

这是我的完整代码,根据您提供给我的答案,但我仍然遇到异常:

using System;
using Android.App;
using Android.Content;
using Android.Media;
using Android.Support.V4.App;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using Android.Widget;

namespace Diabetes.Droid
{
    [BroadcastReceiver]
    [IntentFilter(new string[] { "android.intent.action.BOOT_COMPLETED" }, Priority = (int)IntentFilterPriority.LowPriority)]
    public class AlarmReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            var message = intent.GetStringExtra("message");
            var title = intent.GetStringExtra("title");

            //Show toast here
            Toast.MakeText(context, "Hello it's me ", ToastLength.Short).Show();
            var extras = intent.Extras;

            if (extras != null && !extras.IsEmpty)
            {
                NotificationManager manager_ = context.GetSystemService(Context.NotificationService) as NotificationManager;
                var notificationId = extras.GetInt("NotificationIdKey", -1);
                if (notificationId != -1)
                {
                    manager_.Cancel(notificationId);
                }
            }

            AlarmReceiver customReceiver = new AlarmReceiver();

            //Create intent for action 1 (TAKE)
            var actionIntent1 = new Intent();
            actionIntent1.SetAction("ARCHIVE");
            var pIntent1 = PendingIntent.GetBroadcast(context, 0, actionIntent1, PendingIntentFlags.CancelCurrent);

            //Create intent for action 2 (REPLY)
            var actionIntent2 = new Intent();
            actionIntent2.SetAction("REPLY");
            var pIntent2 = PendingIntent.GetBroadcast(context, 0, actionIntent2, PendingIntentFlags.CancelCurrent);

            Intent resultIntent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
            /*
            var resultIntent = new Intent(context, typeof(MainActivity));
            resultIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);*/

            var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);

            var pending = PendingIntent.GetActivity(context, 0,
                resultIntent,
                PendingIntentFlags.CancelCurrent);

            // Instantiate the Big Text style:
            Notification.BigTextStyle textStyle = new Notification.BigTextStyle();

            var builder = new Notification.Builder(context)
                .SetContentTitle("Diabetics Reminder")
                .SetDefaults(NotificationDefaults.Sound)
                .AddAction(Resource.Drawable.tick_notify, "REPLY", pIntent1)
                .AddAction(Resource.Drawable.cancel_notify, "ARCHIVE", pIntent2)
                .SetSmallIcon(Resource.Drawable.ic_launcher)
                .SetStyle(new Notification
                    .BigTextStyle()
                    .SetSummaryText("")
                    .SetBigContentTitle(title)
                    .BigText(message))
                .SetDefaults(NotificationDefaults.All);

            builder.SetContentIntent(pending);

            var notification = builder.Build();
            //Add intent filters for each action and register them on a broadcast receiver
            var intentFilter = new IntentFilter();
            intentFilter.AddAction("ARCHIVE");
            intentFilter.AddAction("REPLY");

            context.RegisterReceiver(customReceiver, intentFilter);

            var manager = NotificationManager.FromContext(context);
            manager.Notify(10010, notification);
        }
    }
}

这是错误图像:

Error Image

最佳答案

您需要一个 BroadcastReceiver 才能在单击操作时显示 Toast。 对于每个操作,您都需要一个触发 BroadcastReceiver Intent 的 Intent。这是一个关于它的外观的示例:

自定义广播接收器

[BroadcastReceiver]
public class CustomActionReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        // Show toast here
        Toast.MakeText(context, intent.Action, ToastLength.Short).Show();

        var extras = intent.Extras;
        if (extras != null && !extras.IsEmpty)
        {
            NotificationManager manager = context.GetSystemService(Context.NotificationService) as NotificationManager;
            var notificationId = extras.GetInt("NotificationIdKey", -1);
            if (notificationId != -1)
            {
                manager.Cancel(notificationId);
            }
        }
    }
}

构建通知

var customReceiver = new CustomActionReceiver();

// Create intent for action 1 (ARCHIVE)
var actionIntent1 = new Intent();
actionIntent1.SetAction("ARCHIVE");
var pIntent1 = PendingIntent.GetBroadcast(context, 0, actionIntent1, PendingIntentFlags.CancelCurrent);

// Create intent for action 2 (REPLY)
var actionIntent2 = new Intent();
actionIntent2.SetAction("REPLY");
var pIntent2 = PendingIntent.GetBroadcast(context, 0, actionIntent2, PendingIntentFlags.CancelCurrent);


Intent resultIntent = context.PackageManager.GetLaunchIntentForPackage(context.PackageName);
var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);

var builder = new NotificationCompat.Builder(context)
    .SetContentIntent(contentIntent).SetSmallIcon(Resource.Drawable.ic_launcher)
    .SetContentTitle(title)
    .SetStyle(style)
    .SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis())
    .AddAction(Resource.Drawable.tick_notify, "ARCHIVE", pIntent1)
    .AddAction(Resource.Drawable.cancel_notify, "REPLY", pIntent2)
    .SetAutoCancel(true);

builder.SetDefaults((int)(NotificationDefaults.Sound | NotificationDefaults.Vibrate));

// Add intent filters for each action and register them on a broadcast receiver
var intentFilter = new IntentFilter();
intentFilter.AddAction("ARCHIVE");
intentFilter.AddAction("REPLY");

context.RegisterReceiver(customReceiver, intentFilter);

var notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
notificationManager.Notify(0, builder.Build());

关于c# - Android 通知按钮 (AddAction) 在按下时发出 Toast 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862583/

相关文章:

C# - 使用两个 .txt 文件比较/替换文本

c# - 是否可以在同一个 asp.net 网站中使用 C# 和 vb.net?

c# - 从 C# 的集成服务目录中提取 dtsx

java - 从 Activity 中访问应用程序广播接收器?

python - OpenStack Ceilometer 客户端出现问题

swift3 - 每周触发通知 Swift 3

c# - 简单的数学题错了

android - Dagger 2 : Error about subcomponents, 但我的应用程序中没有任何子组件

android - 在android中实现hilt库时gradle出错

javascript - 浏览器通知调用网站