Android - Как я могу обновить данные или пользовательский интерфейс в своей деятельности, когда Pu sh Уведомление FCM получено? - PullRequest
1 голос
/ 11 февраля 2020

У меня есть следующее FirebaseMessagingService, которое прекрасно работает, когда я получаю уведомление pu sh, и приложение находится на переднем плане:

public class _FCMService extends FirebaseMessagingService {
   @Override
   public void onMessageReceived(RemoteMessage remoteMessage) {
      if (remoteMessage.getData().size() > 0) {
         // Log.i(TAG, "PUSH PAYLOAD: " + remoteMessage.getData());

         JSONObject pushData = new JSONObject(remoteMessage.getData());
         pushType = pushData.optString("pushType");
         pushMessage = pushData.optString("body");
         Log.i(TAG, "ON PUSH RECEIVED - pushType: " + pushType);
         Log.i(TAG, "ON PUSH RECEIVED - pushMessage: " + pushMessage);


         Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
         NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                 .setContentText(pushMessage)
                 .setStyle(new NotificationCompat.BigTextStyle())
                 .setAutoCancel(true)
                 .setSmallIcon(R.mipmap.ic_launcher)
                 .setSound(defaultSoundUri);
         NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         assert notificationManager != null;
         notificationManager.notify(0 , notificationBuilder.build());
      }
   }



   @Override
   public void onNewToken(@NotNull String token) {
      Log.i(TAG, "Refreshed token: " + token);
      ANDROID_DEVICE_TOKEN = token;
   }
}

Итак, если я получаю pu sh, Logcat распечатывает тело уведомления и (если присутствует) строку pushType.

Что мне нужно сделать, это сделать мои другие данные об обновлении Активности при получении pu sh, а также получить pushMessage и pushType строк.

Я знаю, как это сделать в iOS Swift - используя NotificationCenter - но понятия не имею о Android, я пробовал LocalBroadcaster, но безуспешно.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Вы можете добавить .setContentIntent(NotificationChannelUtil.createPendingIntent(this, pushMessage, pushType)) к вашему notificaitionBuilder.

Где эта функция находится внутри класса утилит, например:

public class NotificationChannelUtil {

    private NotificationChannelUtil() {}

 public static PendingIntent createPendingIntent(Context context, String pushMessage, String pushType) {
        Intent intent = new Intent(context, YourWantedActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("pushMessage", pushMessage);
        intent.putExtra("pushType", pushType);
        return PendingIntent.getActivity(context, 0 /* request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
    }
}
0 голосов
/ 12 февраля 2020

Я нашел решение для моей проблемы, которое на самом деле похоже на экземпляр iOS NotificationCenter. Я добавил этот класс в свой файл _FCMService. java:

class NotificationCenter {
   private static NotificationCenter _instance;
   private HashMap<String, ArrayList<Runnable>> registredObjects;
   private NotificationCenter(){
      registredObjects = new HashMap<>();
   }

   //returning the reference
   static synchronized NotificationCenter defaultCenter(){
      if(_instance == null)
         _instance = new NotificationCenter();
      return _instance;
   }

   synchronized void addFunctionForNotification(String notificationName, Runnable r){
      ArrayList<Runnable> list = registredObjects.get(notificationName);
      if(list == null) {
         list = new ArrayList<Runnable>();
         registredObjects.put(notificationName, list);
      }
      list.add(r);
   }

   public synchronized void removeFunctionForNotification(String notificationName, Runnable r){
      ArrayList<Runnable> list = registredObjects.get(notificationName);
      if(list != null) {
         list.remove(r);
      }
   }

   synchronized void postNotification(String notificationName){
      ArrayList<Runnable> list = registredObjects.get(notificationName);
      if(list != null) {
         for(Runnable r: list)
            r.run();
      }
   }
}

Затем я вызвал его внутри функции onMessageReceived():

NotificationCenter.defaultCenter().postNotification("pushNotif");

Наконец, я ' Мы добавили наблюдателя в функцию onStart() моей Деятельности следующим образом:

@Override
   protected void onStart() {
      super.onStart();

      // Start NotificationCenter to observe for new messages
      NotificationCenter.defaultCenter().addFunctionForNotification("pushNotif", new Runnable() {
         @Override
         public void run() {
            Log.i(TAG, "Obj Details -> pushMessage: " + pushMessage + "\npushType" + pushType);

      }});
   }

Он работает плавно, надеюсь, это поможет кому-то еще.

...