【问题标题】:Android Notification Button (AddAction) to make a Toast Message when pressedAndroid 通知按钮 (AddAction) 在按下时发出 Toast 消息
【发布时间】:2017-10-21 11:02:48
【问题描述】:

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

这是我的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));

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

请帮帮我,我是 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);
        }
    }
}

这是错误图片:

【问题讨论】:

    标签: c# android notifications xamarin.android


    【解决方案1】:

    您需要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());
    

    【讨论】:

    • 我试图实现你的答案@Rendy,但出现错误,所以请检查我的完整代码,我已经更新了我的帖子
    【解决方案2】:

    您不能在另一个广播接收器中注册广播接收器意图。试试这个:

    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)
                {
                    var manager_ = context.GetSystemService(Context.NotificationService) as NotificationManager;
                    var notificationId = extras.GetInt("NotificationIdKey", -1);
                    if (notificationId != -1)
                    {
                        manager_.Cancel(notificationId);
                    }
                }
    
                // 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 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();
    
                var manager = NotificationManager.FromContext(context);
                manager.Notify(10010, notification);
            }
        }
    
        [BroadcastReceiver]
        [IntentFilter(new string[] { "ARCHIVE" , "REPLY" })]
        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)
                {
                    var manager = context.GetSystemService(Context.NotificationService) as NotificationManager;
                    var notificationId = extras.GetInt("NotificationIdKey", -1);
                    if (notificationId != -1)
                    {
                        manager.Cancel(notificationId);
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢@Rendy Del Rosario
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多