обновить представление переработчика при получении уведомления fcm - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу обновить мое представление рециркулятора во фрагменте, пока получаю уведомление FCM (если определенный фрагмент открыт), иначе получаю уведомление.

Я пробовал несколько решений, но это не сработало.

MyFirebaseMessagingService.java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Map<String, String> data = remoteMessage.getData();

    if (remoteMessage.getNotification() != null) {
        String noti_body = remoteMessage.getNotification().getBody();
        String noti_title = remoteMessage.getNotification().getTitle();
        String noti_activity = data.get("activity");

        mBuilder = new NotificationCompat.Builder(this, "M_CH_ID")
                .setSmallIcon(R.mipmap.logo)
                .setContentTitle(noti_title)
                .setContentText(noti_body)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.logo))
                .setColor(getResources().getColor(R.color.colorAccent))
                .setDefaults(Notification.DEFAULT_ALL)
                .setPriority(NotificationManager.IMPORTANCE_HIGH)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setAutoCancel(true); // clear notification after click

    if (remoteMessage.getData().size() > 0) {
    fragmentNewJobs c = new fragmentNewJobs();
    if (c.getUserVisibleHint()) {//fragmentNewJobs.is_open
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("activity", noti_activity);
        getApplicationContext().startActivity(intent);
    }else {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("activity", noti_activity);

        @SuppressLint("WrongConstant")
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
        mBuilder.setContentIntent(pi);
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
    }
   }
  }
}

фрагментNewJobs c = новый фрагментNewJobs (); if (c.getUserVisibleHint ())

Я пробовал это, но он загружается fragmentNewJobs.java, даже если я открыл любой экран.

  1. Я хочу обновить recyclerView в fragmentNewJobs.java, только если fragmentNewJobs открыто, иначе получите уведомление.

    1. Я хочу добавить только новый элемент в recyclerView (не загружать все данные, если это возможно)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать Event Bus для публикации сообщения от получателя к определенному фрагменту или деятельности.

А чтобы узнать, видна ли активность или нет, посмотрите на this

Или, если вы используете фрагмент, вы можете использовать статическую переменную в классе Application для отслеживания фрагмента (Основное использование)

0 голосов
/ 14 ноября 2018

я хочу добавить только новый элемент в представление переработчика (не загружать все данные, если это возможно)

  • Вы можете использовать BroadcastManager для отправки события уведомленияк вашей существующей деятельности.Запущенная активность добавит новый элемент в список при получении новой рассылки.
  • Другим вариантом уведомления об активности может быть EventBus , быстро растущая, простая библиотека реализации для уведомления между службами, действиями иФрагменты.

Как использовать BroadcastManager?

Как использовать EventBus?

я хочуобновлять обзор повторов в файле fragNewJobs.java только в том случае, если открыта fragNewJobs, иначе получите уведомление.

Для этого вы можете взять статическое логическое значение в классе Application и сделать его истинным для onResume() фрагмента и сделать его ложнымна onPause().

Затем вы можете проверить видимость фрагмента с помощью ApplicationClass.isFragmentVisible()

Редактировать

Вы можете изменить fragmentVisible логическое значение внутри setUserVisibleHint() из Fragment, это будет работать отлично.Сначала вам нужно будет сделать UserVisibleHint false, потому что это true по умолчанию.Проверьте этот ответ для лучшего понимания.

...