Xamarin Android中已关闭的应用程序未调用OnNewIntent

9

工作原理

我已经按照以下Xamarin指南,在我们的Xamarin Forms应用程序的Android端实现了推送通知:

https://developer.xamarin.com/guides/android/application_fundamentals/notifications/remote-notifications-with-gcm/

这个方法非常有效,当应用程序在后台运行时,正确地调用OnNewIntent。然后,我们调用我们的方法来处理推送通知的意图,一切都很好。

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

问题是什么

如果我们关闭应用程序,触发推送通知,然后单击推送通知,则似乎应用程序不会调用OnNewIntent,并且似乎会像单击应用程序图标一样启动应用程序(调用OnCreate)。

尝试了哪些方法

我尝试实现的主要解决方法如下:

  1. Android OnNewIntent not called

Xamarin只有一个需要字符串URL输入的GetIntent方法,使用以下内容会导致空数据。

Intent intent = new Intent(this, typeof(MainActivity));
Bundle data = intent.Extras;
  1. onNewIntent未被调用

在第二篇帖子中,我们在意图服务、MainActivity.cs文件和清单文件中将LaunchMode更改为SingleTop,但行为没有任何变化。

编辑

推送通知总是被接收到,并且无论应用程序处于后台还是完全关闭时OnMessageReceived始终会被调用。此外,当应用程序处于后台时,OnNewIntent会接收到挂起的意图,但当应用程序关闭时则不会。

this.Intent.Extras;

始终似乎评估为null(目前位于OnResume方法中)。

1个回答

4

在安卓系统中,接收通知分为通知和数据通知两种方式,而应用程序的行为也会有所不同。

查看云消息文档中的表格,链接如下:https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages

App State  |    Notification     |        Data        |    Both
-------------------------------------------------------------------------------------
Foreground |  onMessageReceived  |  onMessageReceived | onMessageReceived
Background |  System tray        |  onMessageReceived | Notification: system tray
                                                        Data: in extras of the intent

在您的服务中,当您的通知在onMessageReceived中到达时,您需要处理传入的通知并自行决定是否要显示通知或执行其他操作。
从这里听起来,您正在发送常规通知并准备一个PendingIntent,这是按下它时触发OnNewIntent的内容。
当应用程序处于后台且您收到常规通知时,应用程序应该正常启动。如果您已将数据附加到通知中,则应能够从Intent Extras属性中获取它。
因此,您在此处看到的是正确的行为。

感谢您的回复。我已经尝试使用 this.Intent.Extras,并相应地编辑了我的问题。似乎这个 this.Intent 的值总是被覆盖,尽管选择了带有待处理意图的通知,可能是由于我的活动或待处理意图标志的某种组合? - Jarrod L
1
经过测试,发现SingleTop调用了OnNewIntent,但未为MainActivity.Intent设置值,而SingleTop在应用程序已打开时提供所需的功能。因此,我找到的唯一解决方法是删除OnNewIntent,并在OnMessageReceived中设置MainActivity的静态变量以包含意图的值。因此,无论应用程序关闭或处于后台,该意图都可用于OnResume方法。 - Jarrod L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接