Android通知按钮(的addAction)敬酒消息按下
问题描述:
当我想上一个通知(归档)时,一些关于它的一个点击喜欢的按钮添加一个动作,它显示了一个敬酒的消息,下面是一个示例图像:Android通知按钮(的addAction)敬酒消息按下
var contentIntent = PendingIntent.GetActivity(context, 0, resultIntent, PendingIntentFlags.CancelCurrent);
这是我的通知卜ilder代码:
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 bewlow
builder.SetDefaults((int)(NotificationDefaults.Sound | NotificationDefaults.Vibrate));
所以一般我想打一个按钮进行通知,而不是推出一个活动等
帮我在这的Xamarin.android是新请。
EDITTED:
这是我完整的代码,根据答案你提供我,但stilll正在一个例外:
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);
}
}
}
这是错误图片:
答
您需要一个广播接收器才能够在您点击该动作时显示一个Toast。对于每个动作,您需要一个意图激发广播接收器意图。在这里它会是什么样子的例子:
=========广播接收器类==========
[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);
}
}
}
}
======= ==========建立通知============
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);
NotificationManager notificationManager = (NotificationManager)context.GetSystemService(Context.NotificationService);
notificationManager.Notify(0, builder.Build());
答
您不能在另一个广播接收机内注册广播接收机意图。试试这个:
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);
}
}
//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();
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)
{
NotificationManager manager = context.GetSystemService(Context.NotificationService) as NotificationManager;
var notificationId = extras.GetInt("NotificationIdKey", -1);
if (notificationId != -1)
{
manager.Cancel(notificationId);
}
}
}
}
}
+0
非常感谢@Rendy德尔罗萨里奥 –
我试图实现你的答案@Rendy,但我得到一个错误,所以请我的完整的代码我已经更新我的职务 –