Как обрабатывать уведомления pu sh Action? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть уведомление pu sh с 2 действиями (Принять, Отклонить). Как я могу определить, какое действие действительно было выполнено, а затем уведомление исчезло (действуя так, как будто пользователь нажал на фактическое уведомление, а не на кнопку действия)? Похоже, что оба действия касаются go моего метода OnNewIntent , и я хотел бы выполнять различные действия в зависимости от того, какой из них был задействован. Мое уведомление также все еще отображается в панели уведомлений, за исключением того, что действия (кнопки) больше не отображаются. Уведомление полностью исчезает, когда я нажимаю на него.

Вот мой SendLocalNotification метод в FirebaseService (игнорируйте комментарии. Они для меня):

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

И тогда мой OnNewIntent in MainActivity :

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

        base.OnNewIntent(intent);
    }

EDIT: My OnNewIntent имеет эту логику c в настоящее время потому что я использовал MessagingCenter для отправки сообщения подписчику по модели представления и выполнения навигации по представлению. Затем я обнаружил действия, и вот как я оказался здесь, пытаясь сделать этот лог c с кнопками уведомлений.

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Создайте Nofification с помощью действий «да», «нет» и «возможно»:

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

Обратите внимание на уместно при отправке действий.

0 голосов
/ 20 апреля 2020

Таким образом, я смог выяснить, что (я думаю) мне нужно, следуя некоторым из ответов Барела, а также некоторым другим страницам SO и складывая это воедино.

Я уверен, что я бегу в некоторые изменения, которые мне нужно сделать позже, но на данный момент это привело меня к тому, что у меня могло быть 2 действия (Принять, Отклонить), выбрать любую из кнопок действий, а затем нажать несколько логик c, куда я собираюсь реализовать то, что я хочу сделать с обоими действиями.


SendLocalNotification * метод 1007 * в FirebaseService класс:

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

И тогда у меня было обновить мои OnNewIntent переопределить в MainActivity . Обратите внимание на 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);
    }
...