当应用程序在后台时,无法从意图中获得额外收益

时间:2018-12-19 04:44:37

标签: java android android-intent android-notifications android-pendingintent

单击通知后,我尝试在MainActivity中执行一个功能。 该功能需要我放入意向附加中的数据。

问题是当我在应用程序运行时单击通知时执行该功能,但是当我在应用程序处于后台时单击通知时未执行该功能。我已经检查了它,这是因为当应用程序在后台时,我放入意向附加中的数据为空。

如何解决此问题?谢谢!

这是我收到的回复:

{
    "to":"blablabla",
    "notification": {
        "body":"Sentiment Negative from customer",
        "title":"Mokita"
    },
    "data" : {
        "room_id":1516333
    }
}

这是我的通知代码:

public void onMessageReceived(RemoteMessage message) {
    super.onMessageReceived(message);
    Log.d("msg", "onMessageReceived: " + message.getData().get("room_id"));
    String roomId = message.getData().get("room_id");

    Intent intent = new Intent(this, HomePageTabActivity.class);
    intent.putExtra("fromNotification", true);
    intent.putExtra("roomId", roomId);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    String channelId = "Default";
    NotificationCompat.Builder builder = new  NotificationCompat.Builder(this, channelId)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(message.getNotification().getTitle())
            .setContentText(message.getNotification().getBody())
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId, "Default channel", NotificationManager.IMPORTANCE_DEFAULT);
        manager.createNotificationChannel(channel);
    }

    manager.notify(0, builder.build());
}

}

这是函数,以及我如何在MainActivity中执行它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawer);
    onNewIntent(getIntent());
}

@Override
    public void onNewIntent(Intent intent){
        Bundle extras = intent.getExtras();
        if(extras != null){
            if(extras.containsKey("fromNotification") || extras.containsKey("roomId")) {
                openChatRoom(Long.valueOf(extras.getString("roomId")));
            }else if(extras.containsKey("fromNotification") && extras.containsKey("roomId")){
                openChatRoom(Long.valueOf(extras.getString("roomId")));
            }else{
                Log.e("EXTRAS room",""+extras.getString("roomId"));
                Log.e("EXTRAS STATUS",""+extras.getBoolean("fromNotification"));
            }
        }else{
            Toast.makeText(HomePageTabActivity.this,"Empty",Toast.LENGTH_SHORT).show();
        }
    }


public void openChatRoom(long roomId){
        Log.d("LONG ROOM",""+roomId);
        QiscusRxExecutor.execute(QiscusApi.getInstance().getChatRoom(roomId),
        new QiscusRxExecutor.Listener<QiscusChatRoom>() {
            @Override
            public void onSuccess(QiscusChatRoom qiscusChatRoom) {
                startActivity(GroupRoomActivity.
                        generateIntent(HomePageTabActivity.this, qiscusChatRoom));
            }
            @Override
            public void onError(Throwable throwable) {
                throwable.printStackTrace();
            }
        });
    }

3 个答案:

答案 0 :(得分:2)

Firebase有两种消息类型:通知消息和数据消息。如果希望FCM SDK自己处理消息,则需要使用notification。当应用程序处于非活动状态时,FCM将使用notification正文显示消息。在这种状态下,onMessageReceived也不会被触发。如果您希望应用处理消息,则需要使用data。您可能需要从

更改推送通知有效负载
{
   "message":{
   "token":"xxxxx:...",
   "notification":{
          "title":"Your title",
          "body":"Your message"
      }
   }
}

{
   "message":{
   "token":"xxxxx:...",
   "data":{
          "title":"Your title",
          "body":"Your message",
          "fromNotification":"true",
          "roomId":"123"
      }
   }
}

您还需要相应地处理onMessageReceived(RemoteMessage remoteMessage)中的消息。您可以在Notifications and data messages中阅读有关通知行为的信息。

答案 1 :(得分:1)

Receive messages in an Android app。带有通知和数据有效载荷(后台和前台)的消息。在这种情况下,数据有效载荷将交付给启动程序活动的其他目的。如果要在其他活动中使用它,则必须在数据有效负载上定义click_action。因此,您可以在启动器活动中获得更多的意图。

答案 2 :(得分:1)

这些有效负载将传递到您在挂起的意图中指定的活动。因此,当用户点击您的通知时,HomePageTabActivity启动,您可以通过在活动生命周期中的任何地方调用getIntent()来获得意图。但是由于如果已经启动singleTop,则要在活动上设置HomePageTabActivity标志,因此Android不会再次启动它,而会将新的Intent(通知中提供)传递给onNewIntent()。您可以在此处使用它,甚至可以调用getIntent()从那里获取新值。