Android 当应用程序处于后台时,第二个推送通知有效负载数据未在附加中接收

Android 2nd Push Notification Payload Data Not Receiving In Extras When App is In Background

我遇到了一个非常奇怪的问题,即当应用程序处于后台时第二次没有收到有效负载数据。

例如 -(当我还没有启动我的应用程序时)

当我的应用程序打开时,一切正常。即使我在手动打开我的应用程序后将其置于后台,所有通知也能正常工作。

这是我的清单代码

      <activity
            android:name=".PagerActivity"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

这是我的 activity 代码

 @Override
    public void onNewIntent(Intent newIntent) {
        this.setIntent(newIntent);

        // Now getIntent() returns the updated Intent
        if(getIntent().hasExtra("sno")){
            Log.d("New Intent DATA", "Yes it has the data sno is: " + getIntent().getExtras().getString("sno"));
        }


    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getIntent().hasExtra("sno")){
            Log.d("DATA", "Yes it has the data");
        }
    }

我尝试了很多研究但无济于事。如果您需要任何其他详细信息,请告诉我。

我正在使用 firebase 发送带有自定义数据的通知。我也试过它通过网络服务器发送,但仍然没有成功。

我调试了我的应用程序,发现当我通过第二个通知打开我的应用程序时,没有创建新实例。

有两种不同类型的消息

  1. 通知消息
  2. 数据消息

通知消息的负载

 {
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }

数据消息的有效载荷

{
   "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 }

具有通知和数据负载的消息

应用程序在接收包含通知和数据负载的消息时的行为取决于应用程序是在后台还是在前台——本质上,它在接收时是否处于活动状态。

在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。

当在前台时,您的应用会收到一个包含两个有效负载的消息对象。

如果您想将数据与通知一起传递以在应用程序的两种状态(活动和非活动)下工作,您必须使用数据消息。

官方文档中提供了更多详细信息About FCM Messages(Message Types)

当您同时发送 notificationdata payload 时,如果您的应用程序在后台,通知将显示在托盘中,但如果您的启动 activity 是点击通知在后台,它将被带到前台,您将不会收到数据负载。

一个解决方案是将该特定活动的 launch mode 设置为 singleTask 并在 activity 中实现 onNewIntent 以接收 data payload

这样,您的 activity 将被带到前台,位于堆栈中此 activity 顶部的 Activity 将被销毁。

您可以找到有关启动模式的更多信息 here