如何在Xamarin上正确接收Intent Extras

时间:2019-04-26 14:50:53

标签: c# xamarin firebase-cloud-messaging

目前,我正在将this教程用于xamarin推送通知。它就像一种魅力。我现在的目标是正确处理意图。

在我的Firebase消息传递服务中,我创建一个通知并放入其他内容。

private void CreateNotification(Object e)
{
    try
    {
        string title = "";
        string body = "";

        var intent = new Intent(this, typeof(MainActivity));

        var i = e as Intent;
        var bundle = i.Extras;
        title = bundle.GetString("gcm.notification.title");
        body = bundle.GetString("gcm.notification.body");

        intent.PutExtra("view", "test");
        intent.PutExtra("title", title);
        intent.PutExtra("body", body);

        intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
        var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.CancelCurrent | PendingIntentFlags.UpdateCurrent);
        Notification.Builder builder = new Notification.Builder(this);
        builder.SetSmallIcon(Resource.Drawable.icon_notification);
        builder.SetContentIntent(pendingIntent);
        builder.SetLargeIcon(BitmapFactory.DecodeResource(Resources, Resource.Drawable.icon_notification));
        builder.SetContentTitle("Test");
        builder.SetContentText(body);
        builder.SetDefaults(NotificationDefaults.Sound);
        builder.SetAutoCancel(true);
        NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.Notify(1, builder.Build());

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

目前,后台推送通知已得到完美处理。我可以在OnCreate

MainActivity.cs方法中运行简单的一行
Intent.GetStringExtra("view");

这使我获得了CreateNotification中设置的值。

我遇到的问题是试图使意图更加突出。该代码位于MainActivity.cs上,并在前台单击推送通知时触发。

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

    if (Intent.Extras != null)
    {
        foreach (var key in Intent.Extras.KeySet())
        {
            var value = Intent.Extras.GetString(key);
            Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
        }
    } 
}

Intent.Extras始终为null,请问我哪里出错了。

4 个答案:

答案 0 :(得分:0)

请仔细阅读。 Implement FirebaseMessagingService - Foreground notifications

您必须创建FirebaseMessagingService,当您的应用程序处于前台时,您可以在其中接收RemoteMessage。

答案 1 :(得分:0)

实际上,根据文档,处理前台通知的正确方法是实施FirebaseMessagingService

存在更好的解释here

您需要创建一个类似以下的服务类:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
       // private string TAG = "MyFirebaseMsgService";
          public override void OnMessageReceived(RemoteMessage message)
       {
           base.OnMessageReceived(message);
           string messageFrom = message.From;
           string getMessageBody = message.GetNotification().Body;
           SendNotification(message.GetNotification().Body);
       }
    void SendNotification(string messageBody)
    {
        try
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                .SetContentTitle("Title")
                .SetContentText(messageBody)
                .SetAutoCancel(true)
                .SetContentIntent(pendingIntent);

            NotificationManagerCompat notificationManager = NotificationManagerCompat.From(this);
            notificationManager.Notify(0, notificationBuilder.Build());
        }
        catch (Exception ex)
        {

        }
       }
     }

有关更多信息,您可以检查我的SO问题

How to handle Firebase Notification i.e. Notification Messages and Data Messages in Android

答案 2 :(得分:0)

discussion,我得到了一些帮助来解决这个问题。如果您有启动画面,则Intent.Extras可能会出现在此处,因此您可以将MainActivity传递给您。

答案 3 :(得分:0)

也许答案来晚了,但是它可以帮助其他人。

唯一的错误是您正在使用 Intent 代替 intent (传递的参数)

if (Intent.Extras != null)

代替

if (intent.Extras != null)

我也陷入同样的​​分心状态。