代码之家  ›  专栏  ›  技术社区  ›  Phill

检查是否单击了通知

  •  0
  • Phill  · 技术社区  · 7 年前

    我有一个带有警报的应用程序,每次警报触发时,应用程序都会向用户发送通知,是否可以知道用户是否单击或关闭了通知?

    我的通知代码如下:

    public override void OnReceive(Context context, Intent intent)
    {
        try
        {
           Settings.AlarmNotification = 1;
    
                if (System.DateTime.Now.DayOfWeek == DayOfWeek.Thursday)
                {
                    Settings.AlarmCount =0;
                }
    
                var title = "Test";
                var message = "Something";
    
                Intent backIntent = new Intent(context, typeof(MainActivity));
                backIntent.SetFlags(ActivityFlags.NewTask);
    
    
    
                var resultIntent = new Intent(context, typeof(MainActivity));
    
    
    
                PendingIntent pending = PendingIntent.GetActivities(context, 0,
                    new Intent[] { backIntent, resultIntent },
                    PendingIntentFlags.OneShot);
    
                var builder =
                    new Notification.Builder(context)
                        .SetContentTitle(title)
                        .SetContentText(message)
                        .SetAutoCancel(true)
                        .SetSmallIcon(Resource.Drawable.icon)
                        .SetDefaults(NotificationDefaults.All);
    
                builder.SetContentIntent(pending);
                var notification = builder.Build();
                var manager = NotificationManager.FromContext(context);
                manager.Notify(1331, notification);
    
        }
        catch (Exception)
        {
    
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Trevor Balcom    7 年前

    Notification.Builder NotificationCompat.Builder 两者都有 SetDeleteIntent 可用于触发 BroadcastReceiver 通知关闭时(即使使用“全部清除”)。这 广播接收机 也会在单击通知时触发,因为您已将通知设置为自动取消。

    首先,设置 PendingIntent 发送到 广播接收机 :

    var deleteIntent = new Intent(context, typeof(NotificationBroadcastReceiver));
    deleteIntent.SetAction("Action");
    deleteIntent.PutExtra("key", key);
    // TODO: Set extras as needed.
    var deletePendingIntent = PendingIntent.GetBroadcast(context, _notificationId, deleteIntent, PendingIntentFlags.CancelCurrent);
    

    然后关联 处理意图 通知如下:

    var builder = new NotificationCompat.Builder(context, RouteUpdateChannelId)
                .SetDefaults(NotificationCompat.DefaultAll)
                .SetAutoCancel(true)
                // TODO: Setup Notification
                .SetDeleteIntent(deletePendingIntent);
    

    现在您可以添加 广播接收机 到您的Android项目:

    [BroadcastReceiver]
    public class NotificationBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            if (intent.Action == "Action")
            {
                // TODO: Grab extras from the Intent as needed.
                var key = intent.GetStringExtra("key");
                // TODO: Handle notification closing here...
            }
        }
     }
    
        2
  •  2
  •   SushiHangover    7 年前

    如果你想“触发” MainActivity 当用户单击通知时,可以设置通知的 PendingIntent 使用 Intent 其中包括您要传递给它的任何其他信息。

    var title = "Winner, Winner, Chicken Dinner";
    var message = "You just won a million StackOverflow reputation points";
    
    var alarmIntent = new Intent(context, typeof(MainActivity));
    alarmIntent.SetAction("ASushiNotification");
    alarmIntent.PutExtra("MessageFromSushiHangover", message);
    var pending = PendingIntent.GetActivity(context, 0, alarmIntent, PendingIntentFlags.CancelCurrent);
    
    // set your notification as normal using ".SetContentIntent(pending)"
    

    MainActivty ,设置其 LaunchMode SingleTop 因此,如果活动已经全部运行,操作系统将重用该活动,而不是启动一个新的活动:

    [Activity(Label = "A Super Duper App", MainLauncher = true, Icon = "@mipmap/icon", LaunchMode = Android.Content.PM.LaunchMode.SingleTop)]
    

    有两个进入点 MainActvity 对于通知意图,如果活动已在运行, OnNewIntent 将调用,目的是在通知上设置。如果你的应用是 未运行 , 维护性 将正常创建 但是 将包括通知中的意图。

    创建方法( NotificationClickedOn )这样做的目的和您应用到它的任何额外数据:

    void NotificationClickedOn(Intent intent)
    {
        if (intent.Action == "ASushiNotification" && intent.HasExtra("MessageFromSushiHangover"))
        {
            /// Do something now that you know the user clicked on the notifcation...
            var notificationMessage = intent.Extras.GetString("MessageFromSushiHangover");
            var winnerToast = Toast.MakeText(this, $"{notificationMessage}.\n\n🍣 Please send 2 BitCoins to SushiHangover to process your winning ticket! 🍣", ToastLength.Long);
            winnerToast.SetGravity(Android.Views.GravityFlags.Center, 0, 0);
            winnerToast.Show();
        }
    }
    

    在您的 主活动 ,重写 OnNewIntent公司 方法和调用 通知单击打开 :

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        NotificationClickedOn(intent);
    }
    

    在您现有的 OnCreate 覆盖添加呼叫 通知单击打开 :

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
    
        ~~~~~
    
        NotificationClickedOn(Intent);
    
        ~~~~~
     }
    

    现在,当有人单击您的通知时,您将能够确定您的应用程序是否已在运行:

    enter image description here

    您的应用程序(&A);如果需要,将创建活动,并且 主要活动 将显示并显示祝酒词:

    enter image description here