2016-12-23 4 views
0

У меня есть пример вывод на сервере, чтобы подтолкнуть уведомления приложения, которое показано ниже:Firebase сохранить данные, когда приложение находится в фоновом режиме

{ 
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", 
    "notification" : { 
     "body" : "great match!", 
     "title" : "Portugal vs. Denmark", 
     "icon" : "myicon" 
    }, 
    "data" : { 
     "Nick" : "Mario", 
     "Room" : "PortugalVSDenmark" 
    } 
    } 

Как сохранить содержимое в данном, когда приложение находится в фон как onMessageReceived запускается только тогда, когда приложение находится на переднем плане.

+0

Вы получаете уведомление правильно? –

+0

какое устройство вы используете? –

+0

yep. Я получаю уведомление. Но onMessageReceived не называется. Его вызывается только тогда, когда приложение находится на переднем плане. – John

ответ

1

В соответствии с документацией, onMessageReceived() будет инициироваться, когда ваше приложение является передним или фоновым для сообщения уведомления и загрузки данных. но когда ваше приложение находится в фоновом режиме, уведомление будет обработано в лотке уведомлений. Но сообщение о загрузке данных будет принято как обычно (через onMessageReceived()). Никаких проблем не будет. перед этим вы должны реализовать логику обработки сообщений в клиентском приложении.

check the documentation

+0

Я попытался поместить некоторый оператор печати в 'onMessageReceived()', но он запускается только тогда, когда мое приложение находится на переднем плане. – John

+0

Да. Даже журнал не будет работать на этом этапе. Google делает некоторые трюки. вы можете получить информацию при проверке классов FireBase. – Noorul

+0

см. Этот документ: https://firebase.google.com/docs/notifications/android/console-audience#backgrounded – Noorul

1

Вы можете использовать getIntent() getExtras(). для получения намерения при запуске, чтобы получить намерение.

подробнее here

например:

Bundle bundle = getIntent().getExtras(); 
    if (bundle != null) { 
     if (bundle.containsKey("data")) { 
     Intent intent = new Intent(mContext, ExpectedActivity.Class) 
     intent.putExtras("PUSH_KEY",bundle.get("data").toString()); 
     startActivity(intent) 
    } 
    } 

Поместите этот код в вашей пусковой activity.And это переведет вас к вашей ожидаемой активности, даже если приложение будет убит или в фоновом режиме.

Также вы можете попробовать изменить свой JSON как этот

{ 
"data" : { 
"body" : "great match!", 
"title": "Portugal vs. Denmark" , 
"icon : "myicon," 
"Nick" : "Mario", 
"Room" : "PortugalVSDenmark" 
}, 
"to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..." 
} 
+0

похоже, удалив тег уведомления в json, сделал трюк. Источник: https://code.google.com/p/android/issues/detail?id=219084 – John

+0

Что делать, если есть несколько уведомлений? @sunil – John

+0

@John Sry для позднего ответа Я был в отпуске. Как вы хотите обрабатывать несколько уведомлений?. Вы можете попробовать с ним PendingIntent. –

0

Я нашел решение. Кажется, что я должен удалить часть notification в json при отправке с локального сервера на сервер Firebase. Затем он запустит onMessageReceived, если приложение находится на заднем плане.

Источник: https://code.google.com/p/android/issues/detail?id=219084

Так что я сделал удалить тег уведомления из JSON и вручную создать мое мое уведомление. Затем используйте метод @ sunil для извлечения из активности запуска.

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    System.out.println("Remote Message: " + remoteMessage.toString()); 
    System.out.println("Token: " + FirebaseInstanceId.getInstance().getToken()); 
    System.out.println("From: " + remoteMessage.getFrom()); 
    sendNotification(remoteMessage.getData().toString()); 
    Log.d(TAG, "Message Data payload" + remoteMessage.getData()); 
} 

private void sendNotification(String messageData) { 
    Intent intent = new Intent(this, HomeActivity.class); 
    intent.putExtra("data", messageData); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle("DeliveryOptions") 
      .setContentText("Test") 
      .setAutoCancel(true) 
      .setDefaults(Notification.DEFAULT_SOUND) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(0, notificationBuilder.build()); 
} 
Смежные вопросы