2017-03-21 73 views
2

我想让我的应用程序在后台处理数据有效负载。当应用程序在后台处理数据有效载荷

"data": { 
     "aKey": "aValue", 
     "customtitle": "my title", 
     "custombody": "my body", 
     "customimage": "my image" 
    }, 
    "notification": { 
     "title": "my title", 
     "text": "some text", 
     "icon": "icon to use", 
     "sound": "soundtouse" 
    } 

在背景执行的应用程序

..the数据有效载荷在你的发射活动的意图的额外交付的部分手柄通知消息下Accroding到documentation

在我的申请中,onMessageReceived只收到RemoteMessage对象。

我试图覆盖onMessageReceived签名接受Intent但这不起作用。

除了文档中的最后一句,我可以找到任何教程或解释。

有人能告诉我哪里有应用程序在后台或关闭时如何处理数据有效载荷的例子吗?

如果应用程序已打开,那么它会从我的onMessageReceived(RemoteMessage)方法处理数据有效负载。

回答

0

您可以简单地使用Map来检索数据frm RemoteMessage对象。

public void onMessageReceived(RemoteMessage msg) 
     { 
      Log.d("Remote msg",msg.getData().toString()); 
      try 
      { 
       Map<String, String> params = msg.getData(); 
       JSONObject object = new JSONObject(params); 
       Log.d("Remote msg", object.toString()); 
      } 
     } 

UPDATE 通知消息将只接受在这里onMessageReceived当应用程序在前台。

在后台应用程序中,应用程序在通知托盘中接收通知有效内容,并且只在用户点击通知时处理数据有效内容。 在前台时,您的应用程序会收到一个消息对象,其中包含两个可用的有效内容。 来源:https://firebase.google.com/docs/cloud-messaging/concept-options

解决方法: 看起来你同时使用的通知和数据。你可以只使用数据,然后调用onMessageReceived(),你应该触发你自己的通知。 来源: https://medium.com/@Miqubel/mastering-firebase-notifications-36a3ffe57c41#.z1s28d59d

+0

onMessageReceived在应用程序处于后台时不会调用。 –

+0

这就是预期的行为。更新了评论。只有当用户单击通知时,您才能够处理onMessageReceived()。 –

+0

@ user-44651添加了一个workoaround –

0

你只会遇到FCM的预期行为。在您链接的documentation,该表显示了使用data有效载荷时,它只会引发onMessageReceived()如果消息有效载荷只有数据:

"data": { 
     "aKey": "aValue", 
     "customtitle": "my title", 
     "custombody": "my body", 
     "customimage": "my image" 
    } 
在您的消息

但你同时使用,notificationdata有效载荷。这意味着当您的应用程序处于后台时,有效内容将由Android系统本身处理,并在通知纸盒中显示notification详细信息。

然后,当对Android的处理通知水龙头用户,它应该打开你的应用程序(通常在MainActivity或任何活动设置使用click_action打开),并从那里,你应该处理这个意图,像这样:

Intent intent = getIntent(); 
    String pos = getIntent().getStringExtra("<YOUR KEY HERE>"); 
    if(pos !=null){ 
     selectDrawerItem(navigationView.getMenu().getItem(Integer.parseInt(pos))); 
    } 
+0

让我看看我是否理解这个正确的,所以如果只有'data'有效负载,然后'onMessageReceived()'将被调用,并且它将在后台/前台/被杀应用中工作,即使它是发送到这样的主题https://stackoverflow.com/questions/47505629/how-can-i-send-notification-to-various-topics/47542196#47542196 –

+0

@PeterHaddad'onMessageReceived()'应该触发,无论是否应用程序在前台/后台。但是对于死亡/停止状态,每个设备可能会有所不同。请参阅我的答案[这里](https://stackoverflow.com/a/39505298/4625829) –

+0

谢谢AL。最后一个问题(并且会停止打扰您:p)当仅使用主题发送通知时,如果用户从其他设备登录到其帐户,他是否会收到他在该设备中订阅的通知?那么订阅的主题是否取决于经过身份验证的用户或设备? –

相关问题