Reputation:
I want to add an action on a Button of a Notification (Archive) like when some one clicks on it, it shows a toast message , below is a sample image :
This is my
PendingIntent
line of code :
var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);
This is my Notification Builder code :
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));
So generally i want to make a button to make a Notification instead of launching an Activity etc.
Help me on this I am new in Xamarin.android please.
EDITED:
This is my full code, according to the answer you provided to me but I still getting an Exception:
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);
}
}
}
This is the Error Image :
Upvotes: 2
Views: 4530
Reputation: 1297
You need a BroadcastReceiver
to be able to show a Toast
when you click on the action.
For each action, you need an Intent
that fires a BroadcastReceiver Intent. Here an example on how it would look like:
Custom BroadcastReceiver
[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);
}
}
}
}
Build the Notification
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());
Upvotes: 2
Reputation: 1297
You cannot register a broadcast receiver intent inside another broadcast receiver. Try this instead:
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);
}
}
}
}
}
Upvotes: 1