【问题标题】:How to handle push notification Action taps?如何处理推送通知动作点击?
【发布时间】:2020-04-19 19:34:15
【问题描述】:

我有一个包含 2 个操作(接受、拒绝)的推送通知。如何确定实际点击了哪个操作,然后让通知消失(就像用户点击了实际通知而不是操作按钮一样)?看起来两个动作点击都进入了我的 OnNewIntent 方法,我想根据哪个被点击来执行不同的操作。除了不再显示操作(按钮)之外,我的通知也仍然显示在通知栏中。当我点击它时,通知会完全消失。

这是我在 FirebaseService 中的 SendLocalNotification 方法(忽略 cmets。它们是给我的):

void SendLocalNotification(string body)
    {
        var intent = new Intent(this, typeof(MainActivity));
        intent.AddFlags(ActivityFlags.SingleTop);
        intent.PutExtra("OpenPage", "SomePage");
        //intent.PutExtra("message", body);

        //Unique request code to avoid PendingIntent collision.
        var requestCode = new Random().Next();
        var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);

        var notificationBuilder = new NotificationCompat.Builder(this)
            .AddAction(0, "Accept", pendingIntent) // THIS ADDS A BUTTON TO THE NOTIFICATION
            .AddAction(0, "Decline", pendingIntent) // THIS ADDS A BUTTON TO THE NOTIFICATION
            .SetContentTitle("Load Match")
            .SetSmallIcon(Resource.Drawable.laundry_basket_icon_15875)
            .SetContentText(body)
            .SetAutoCancel(true)
            .SetShowWhen(false)
            .SetContentIntent(pendingIntent);

        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
        }

        var notificationManager = NotificationManager.FromContext(this);
        notificationManager.Notify(0, notificationBuilder.Build());
    }

然后我在 MainActivity 中的 OnNewIntent

protected override void OnNewIntent(Intent intent)
    {
        if (intent.HasExtra("OpenPage"))
        {
            MessagingCenter.Send(Xamarin.Forms.Application.Current, "Notification");
        }

        base.OnNewIntent(intent);
    }

编辑:我的 OnNewIntent 目前具有该逻辑,因为我正在使用 MessagingCenter 向视图模型上的订阅者发送消息并进行视图导航。然后我发现了 Actions,这就是我最终在这里尝试使用通知按钮执行该逻辑的方式。

【问题讨论】:

    标签: c# android firebase xamarin.forms push-notification


    【解决方案1】:

    使用“是”、“否”和“可能”操作创建通知:

    //Yes intent
    Intent yesReceive = new Intent();  
    yesReceive.setAction(YES_ACTION);
    PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes);
    
    //Maybe intent
    Intent maybeReceive = new Intent();  
    maybeReceive.setAction(MAYBE_ACTION);
    PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe);
    
    //No intent
    Intent noReceive = new Intent();  
    noReceive.setAction(NO_ACTION);
    PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo);
    

    然后创建广播接收器以在点击操作时调用:

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
    
        if(YES_ACTION.equals(action)) {
            Log.v("shuffTest","Pressed YES");
        } else if(MAYBE_ACTION.equals(action)) {
            Log.v("shuffTest","Pressed NO");
        } else if(NO_ACTION.equals(action)) {
            Log.v("shuffTest","Pressed MAYBE");
        }
    }
    

    在发送操作时注意适当。

    【讨论】:

    • 谢谢巴雷尔。当我实施您的回复时,我可以获得要在通知中显示的操作,但是当我单击其中一个时,我的 OnReceive 覆盖从未被击中。是广播接收器而不是尝试在 OnNewIntent 中做某事吗?
    • 这是我知道的方式,如果你想让接收者被调用,请参见:stackoverflow.com/questions/38919974/…
    【解决方案2】:

    因此,通过遵循 Barel 回答的一些内容以及其他一些 SO 页面并将其拼凑起来,我能够弄清楚(我认为)我需要什么。

    我确定我稍后会遇到一些需要进行的更改,但就目前而言,这让我可以进行 2 个操作(接受、拒绝),选择任一操作按钮,然后点击一些逻辑,我将在其中实现我想要对这两个操作执行的操作。


    FirebaseService 类中的

    SendLocalNotification 方法:

    void SendLocalNotification(string body)
        {
            //Unique request code to avoid PendingIntent collision.
            var requestCode = new Random().Next();
    
            // accept
            var acceptIntent = new Intent(this, typeof(MainActivity));
            acceptIntent.SetAction("ACCEPT_ACTION");
            var pendingIntentAccept = PendingIntent.GetActivity(this, requestCode, acceptIntent, PendingIntentFlags.OneShot);
    
            // decline
            var declineIntent = new Intent(this, typeof(MainActivity));
            declineIntent.SetAction("DECLINE_ACTION");
            var pendingIntentDecline = PendingIntent.GetActivity(this, requestCode, declineIntent, PendingIntentFlags.OneShot);
    
            var notificationBuilder = new NotificationCompat.Builder(this)
                .AddAction(0, "Accept", pendingIntentAccept)
                .AddAction(0, "Decline", pendingIntentDecline)
                .SetContentTitle("Load Match")
                .SetSmallIcon(Resource.Drawable.laundry_basket_icon_15875)
                .SetContentText(body)
                .SetAutoCancel(true)
                .SetShowWhen(false)
                .SetContentIntent(pendingIntentAccept)
                .SetContentIntent(pendingIntentDecline);
    
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
            }
    
            var notificationManager = NotificationManager.FromContext(this);
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    

    然后我必须在 MainActivity 中更新我的 OnNewIntent 覆盖。注意manager.CancelAll()。单击操作后,我必须这样做才能真正从我的栏中删除通知:

    protected override void OnNewIntent(Intent intent)
        {
            switch (intent.Action)
            {
                case "ACCEPT_ACTION":
                    Console.WriteLine("hit accept action case.");
                    break;
                case "DECLINE_ACTION":
                    Console.WriteLine("hit decline action case.");
                    break;
                default:
                    Console.WriteLine("didn't hit either action.");
                    break;
            }
    
            var manager = (NotificationManager)this.GetSystemService(Context.NotificationService);
            manager.CancelAll();
            base.OnNewIntent(intent);
        }
    

    【讨论】:

    • 能否请您标记这个答案,这将帮助更多有同样问题的人:)?
    • 还要再等6个小时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多