接收fcm通知时更新回收者视图

时间:2018-11-14 05:14:18

标签: java android firebase service notifications

我想在接收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());
    }
   }
  }
}
  

fragmentNewJobs c =新的fragmentNewJobs();           如果(c.getUserVisibleHint())

我已经尝试过,但是即使我打开了任何屏幕,它也会加载fragmentNewJobs.java

  1. 仅当recyclerView打开时,我才想刷新fragmentNewJobs.java中的fragmentNewJobs,否则会收到通知。

    1. 我只想向recyclerView添加新项目(如果可能,不加载所有数据)

2 个答案:

答案 0 :(得分:1)

  

我只想向回收者视图添加新项目(如果不加载所有数据,   可能)

  • 您可以使用BroadcastManager将通知事件发送到您现有的活动。当正在运行的活动收到新的广播时,它将在列表中添加新项目。
  • 通知活动的另一个选项可以是EventBus,它是快速增长的易于实现的库,用于在服务,活动和片段之间进行通知。

How to use BroadcastManager?

How to use EventBus?

  

仅在以下情况下,我想刷新fragmentNewJobs.java中的recyclerview:   fragmentNewJobs已打开,否则会收到通知。

为此,您可以在Application类中使用静态布尔值,并将其在Fragment的onResume()上设置为true,在onPause()上设置为false。

然后您可以通过ApplicationClass.isFragmentVisible()

检查Fragment的可见性

修改

您可以在fragmentVisible的{​​{1}}内更改setUserVisibleHint()布尔值,这将非常有效。您最初需要将Fragment设置为假,因为它是真实的默认设置。选中this answer,以更好地理解。

答案 1 :(得分:1)

您可以使用Event Bus将消息从接收者发布到特定的片段或活动。

要了解活动是否可见,请查看this

或者,如果您正在使用片段,则可以在Application类中使用静态变量来跟踪片段(最基本的用法)