如何正确处理Xamarin中的意图

时间:2019-05-14 15:25:20

标签: android firebase xamarin

目前,我正在使用Firebase消息进行推送通知。我将数据附加到我的意图上,以便可以捕获它,单击该按钮时,我的应用程序就可以使用该数据。

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class MyFirebaseMessagingService : FirebaseMessagingService
{
    const string TAG = "MyFirebaseMsgService";

    public override void HandleIntent(Intent intent)
    {
        CreateNotification(intent);
    }

    private void CreateNotification(Object e)
    {

            var i = e as Intent;
            var bundle = i.Extras;
            var intent = new Intent(this, typeof(MainActivity));

            var notificationName = bundle.GetString("notificationName");

            if (!string.IsNullOrEmpty(notificationName))
            {
                intent.PutExtra("notificationName", notificationName);
            }

            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));                
            builder.SetContentText(body);
            builder.SetDefaults(NotificationDefaults.Sound);
            builder.SetAutoCancel(true);
            if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
            {
                builder.SetChannelId("YourChannelID");
            }

            NotificationManager notificationManager = (NotificationManager)GetSystemService(NotificationService);

            notificationManager.Notify(1, builder.Build());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

然后在程序的MainActivity端,当应用程序重新启动回到前台时,就会触发OnCreate。

protected override void OnCreate(Bundle bundle)
{
     ....
     App.NotificationName = Intent.GetStringExtra("notificationName");
     ....
}

我现在遇到的问题是我的设备(Android 7 OS)之一按预期工作,当应用程序进入前台时会触发OnCreate。我现在遇到的问题是在其他设备(Android 8操作系统)上未触发OnCreate。处理此意图的最佳方法是什么,我应该在哪里放置此代码App.NotificationName = Intent.GetStringExtra("notificationName");,以使其在任何设备上触发

1 个答案:

答案 0 :(得分:0)

据我了解,我猜您应该使用OnMessageReceived,然后您就可以通过GetNotification()来获取通知:

public override async void OnMessageReceived(RemoteMessage message)
{
    var fromNotification = message.GetNotification();
    //...use message.Data and prepare the notification to notify
}

当然,该方法取决于您的远程通知有效负载(Notification or Data messages

您还可以在创建通知时使用ActivityFlags.NewTask:

intent = new Intent(Application.Context, typeof(MainPage));
        flags = PendingIntentFlags.CancelCurrent;
        intent.SetFlags(ActivityFlags.NewTask);

但是您必须将MainActivity创建为LaunchMode.SingleTop,并且能够使用Intent实例从这些覆盖的方法在OnNewIntent(Intent intent)和OnCreate(Bundle bundle)处处理通知吐司。 (对于OnCreate,您应使用Activity的Intent属性)