Как синхронизируются с сервером такие приложения как Whatsapp, Viber и т.д.?
Пока запущены, держат соединение с сервером. Когда закрыты, принимают новые сообщение через FCM.
Не знаю как WhatsApp это делает, но если бы я что то вроде WhatsApp захотел бы создать, то использовал бы WebSocket. 
https://en.wikipedia.org/wiki/WebSocket
https://hackernoon.com/how-to-build-your-own-real-...