2017-10-21 90 views
1

當我想上一個通知(歸檔)時,一些關於它的一個點擊喜歡的按鈕添加一個動作,它顯示了一個敬酒的消息,下面是一個示例圖像:Android通知按鈕(的addAction)敬酒消息按下

Image 這是我PendingIntent行代碼:

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

這是錯誤圖片:

Error Image

回答

1

您需要一個廣播接收器才能夠在您點擊該動作時顯示一個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()); 
+0

我試圖實現你的答案@Rendy,但我得到一個錯誤,所以請我的完整的代碼我已經更新我的職務 –

1

您不能在另一個廣播接收機內註冊廣播接收機意圖。試試這個:

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德爾羅薩里奧 –