Не могу получить Дополнения от намерения, когда приложение в фоновом режиме - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь выполнить функцию в моем 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 голосов
/ 19 декабря 2018

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

0 голосов
/ 19 декабря 2018

Firebase имеет два типа сообщений: уведомления и сообщения с данными.Если вы хотите, чтобы FCM SDK обрабатывал сообщения самостоятельно, вам нужно использовать notification.Когда приложение неактивно, FCM будет использовать notification body для отображения сообщений.В этом состоянии 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).О поведении уведомлений можно прочитать в Уведомления и сообщения с данными .

0 голосов
/ 19 декабря 2018

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

...