it-swarm.com.ru

Не могу получить Дополнения от намерения, когда приложение находится в фоновом режиме

Я пытаюсь выполнить функцию в моей 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();
            }
        });
    }
4
Rifki Maulana

Firebase имеет два типа сообщений: уведомления и сообщения с данными. Если вы хотите, чтобы FCM SDK обрабатывал сообщения самостоятельно, вам необходимо использовать notification. Когда приложение неактивно, FCM будет использовать тело notification для отображения сообщений. В этом состоянии onMessageReceived также не будет запущен. Если вы хотите, чтобы приложение обрабатывало сообщения, вам нужно использовать data. Возможно, вам придется изменить полезные данные push-уведомлений с 

{
   "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) соответственно. Вы можете прочитать о поведении уведомлений в Уведомления и сообщения с данными .

2
Amad Yus

Получать сообщения в приложении для Android . Сообщения как с уведомлением, так и с данными, как фоновые, так и передние. В этом случае полезная нагрузка данных доставляется дополнительно к цели вашей деятельности по запуску. Если вы хотите получить его для какой-либо другой деятельности, вам нужно определить click_action для полезной нагрузки данных. Так что получите дополнительное намерение в своей деятельности по запуску. 

1
Aslam Hossin

эти полезные данные будут доставлены в действие, которое вы указываете в ожидании намерения. поэтому, когда пользователь нажимает на ваше уведомление, запускается HomePageTabActivity, и вы можете получить намерение, вызывая getIntent() в любом месте жизненного цикла активности. но поскольку вы устанавливаете флаг singleTop для действия, если HomePageTabActivity уже запущен, Android не запустит его снова и передаст новое намерение (предоставленное в уведомлении) вместо onNewIntent(). вы можете использовать его там или даже вызвать getIntent(), чтобы получить новое значение оттуда.

1
seyed Jafari